perm filename DFTP.OLD[NET,MRC] blob
sn#242252 filedate 1976-10-14 generic text, type T, neo UTF8
TITLE DFTP
IF1,<PRINTX DFTP...>
IF2,<PRINTX ...Is Halfway>
F.TENX==0 ; 0 IF TOPS-10, 1 IF TENEX
F.PCAP==0 ; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED
; ***DEFINITIONS***
DCHOST==37
DCSOKT==303
DEFALO==12
SIZBLK==200
SIZPAG==1000
SIZFIL==↑D5000
LBUFS==100
SBUFS==20
THUD==-1
; REGISTER DEFINITIONS
R1==1
R2==2
R3==3
R4==4
R5==5
R6==6
R7==7
R10==10
R11==11
R12==12
R13==13
R14==14
R15==15
R16==16
R17==17
; (SCRATCH REGISTERS)
REG1==1
REG2==2
REG3==3
REG4==4
; (COMMONLY USED REGISTERS)
IOREG==R5
BPREG==R6
FLAG==R15
UTIL==R16
STAK==R17
; (TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
TCIO==R2 ; IO(REGISTER)
TCIBP==R3 ; B(YTE)P(OINTER)
TCIACB==R4 ; A(DDRESSOF)C(ONTROL)B(LOCK)
TCITLP==R5 ; T(RACE)L(IST)P(OINTER)
TCITCC==R6 ; T(RACE)C(OMMAND)C(OUNTER)
TCIPBP==R7 ; P(ARALLEL)B(YTE)P(OINTER)
TCIPCC==R10 ; P(ARALLEL)C(HARACTER)C(OUNTER)
TCISBP==R11 ; S(ERIAL)B(YTE)P(OINTER)
TCISCC==R12 ; S(ERIAL)C(HARACTER)C(OUNTER)
TCIMAC==R13 ; MA(TCHES--)C(OMMANDS)
TCIMAN==R14 ; MA(TCHES--)N(ULLCHARACTER)
; MACRO DEFINITIONS
SALL
DEFINE BEGINR(SAVLST,%RETN)
< ..SAVL==0
..SAVC==0
IFIDN <SAVLST><ALL>,<..SAVL==77777>
IFDIF <SAVLST><ALL>,<
IRP SAVLST,<
IFG <SAVLST>-20,<!!
PRINTX SAVLST NOT A REGISTER>
IFLE <SAVLST>-20,<
IFN ..SAVL&1←SAVLST,<!!
PRINTX SAVLST SAVED TWICE>
..SAVL==..SAVL!1←SAVLST
..SAVC==..SAVC+1>>>
IFN ..SAVL,<
..REG==17
REPEAT 20,<
IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
..REG==..REG-1>>
DEFINE .%RETN <%RETN> ; UNIQUE LOCATION FOR RETURN AND ENDR
DEFINE .%RETL <%RETN':!>
..SFLG==0 ; LARGEST SKIP RETURN
>
; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
; JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
; ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>
; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>
; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE ENDR(SK,N)
< IFB <SK>,<..N==0>
IFIDN <SK><SKIP>,<..N==N
IFG <..N-..SFLG>,<..SFLG==..N>>
IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
REPEAT ..SFLG,<
AOS -..SAVC(STAK)>>
.%RETL
..REG==0
REPEAT 20,<
IFN ..SAVL&1←..REG,<POP STAK,..REG
..SAVL==..SAVL-1←..REG>
..REG==..REG+1>
POPJ STAK,>
DEFINE CALLR(ROUTIN)
< PUSHJ STAK,ROUTIN>
DEFINE TAIN(MSG)
< HRRZI REG1,MSG
CALLR $TAIN$>
DEFINE TCIN(CLIST,RSTR)
< MOVE TCIO,[RSTR,,CLIST]
CALLR $TCIN$>
DEFINE TCIL(ARG)
< ..CMCH==0
..CMWD==0
..CNUM==0
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..CNUM==..CNUM+1
..IDX==0
IRPC ARG<..IDX==..IDX+1>
IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
..FLAG==<-..FLAG>>
IFL ..FLAG,<!!
PRINTX BAD ARGUMENTS TO TCIN>
..CMWD==<<<..CMCH-1>/5>+1>
..LOC1==.
..LOC2==..LOC1+4
..LOC3==..LOC2+..CNUM
RELOC ..LOC3
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..IDX==0
IRPC ARG<..IDX==..IDX+1>
..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
ASCII /ARG/
IFG ..IDX,<REPEAT ..IDX, <0>>
..LOC3==.>
IFL ..FLAG,<
RELOC ..LOC2
ARG
..LOC2==.
RELOC ..LOC3>
..FLAG==<-..FLAG>>
RELOC ..LOC1
..LOC2
..CNUM
..CMCH
..CMWD
RELOC ..LOC3>
DEFINE TSIN(BUFFER,BUFS,MSG,NOECHO)
< MOVE IOREG,[BUFFER,,5*BUFS]
IFB <NOECHO>,< HRRZI UTIL,MSG>
IFNB <NOECHO>,< HRROI UTIL,MSG>
CALLR $TSIN$>
DEFINE TNIN(MSG,RADIX)
< IFB <RADIX>,< MOVE IOREG,[MSG,,↑D10]>
IFNB <RADIX>,< MOVE IOREG,[MSG,,RADIX]>
CALLR $TNIN$>
DEFINE TNOUT(REG,RADIX)
< IFN <REG1-REG>,< MOVE REG1,REG>
IFB <RADIX>,< HRRZI REG2,↑D10>
IFNB <RADIX>,< HRRZI REG2,RADIX>
CALLR $NOUT$>
DEFINE DCNOUT(REG,RADIX)
< IFN <REG1-REG>,< MOVE REG1,REG>
IFB <RADIX>,< HRROI REG2,↑D10>
IFNB <RADIX>,< HRROI REG2,RADIX>
CALLR $NOUT$>
DEFINE PATH(STRING,FLAGS)
< IFB <FLAGS>,< HRRZI IOREG,STRING>
IFNB <FLAGS>,<
HRRI IOREG,STRING
HRLI IOREG,FLAGS>
CALLR $PATH$>
DEFINE SCOPY(SOURCE,DESTIN)
< ILDB 0,SOURCE
JUMPE 0,.+3
IDPB 0,DESTIN
JRST .-3
MOVE SOURCE,DESTIN
IDPB 0,SOURCE>
; SYSTEM DEPENDENT DEFINITIONS
; (((TOPS-10)))
IFE F.TENX,<
TWOSEG
RELOC 400000
DCCHAN==1
DDCHAN==2
LFCHAN==3
LDCHAN==4
; DEFINITIONS FROM "IMP.MAC"
.IBDEV==0
.IBSTT==1
.IBERR==1
.IBLCL==2
.IBHST==3
.IBRMT==4
.IUSTT==0
.IUCON==3
.IUCLS==4
.IULSN==5
.IULHS==15
.IESOF==5
.IESKT==11
.IEDWN==13
.IETIM==15
DEFINE TBIN(REG)
< TTCALL 0,REG
CAILE REG,"Z"+40
JRST .+3
CAIL REG,"A"+40
SUBI REG,40>
DEFINE TBOUT(REG)
< TTCALL 1,REG>
DEFINE TSOUT(STRING)
< IRP STRING
< TTCALL 3,STRING>>
DEFINE DCBIN(REG)
< SKIPG DCIBUF+2
CALLR NUTMI
SOS DCIBUF+2
ILDB REG,DCIBUF+1>
DEFINE DCBOUT(REG)
< IDPB REG,DCOBUF+1
OUT DCCHAN,
JRST .+2
JRST NETEOT>
DEFINE DCSOUT(STRING)
< IRP STRING
< HRRZI REG1,STRING
CALLR NUTMO>
SKIPN FLAGDD
JRST .+3
HRRZ REG1,DCOBUF
CALLR NUTDD
OUT DCCHAN,
JRST .+2
JRST NETEOT>
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
SEARCH STENEX
DEFINE TBIN(REG)
< PBIN
CAILE REG1,"Z"+40
JRST .+3
CAIL REG1,"A"+40
SUBI REG1,40
IFN <REG1-REG>,< HRRZI REG,(REG1)>>
DEFINE TBOUT(REG)
< IFN <REG1-REG>,< HRRZI REG1,(REG)>
PBOUT>
DEFINE TSOUT(STRING)
< IRP STRING
< HRROI REG1,STRING
PSOUT>>
DEFINE DCBIN(REG)
< MOVE REG1,DCIJFN
BIN
SKIPN FLAGDD
JRST .+3
HRRZI REG1,(REG2)
PBOUT
HRRZI REG,(REG2)>
DEFINE DCBOUT(REG)
< MOVE REG1,DCOJFN
HRRZI REG2,(REG)
BOUT
MOVEI REG2,21
MTOPR>
DEFINE DCSOUT(STRING)
< ..IDX==1
IRP STRING<..IDX==..IDX+2>
SKIPN FLAGDD
JRST .+..IDX
IRP STRING
< HRROI REG1,STRING
PSOUT>
MOVE REG1,DCOJFN
SETZ REG3,
IRP STRING
< HRROI REG2,STRING
SOUT>
MOVEI REG2,21
MTOPR>
>
; (((↑↑↑)))
; ***PROGRAM***
DFTP: RESET
MOVE STAK,[IOWD STSIZ,STBEG]
CALLR S$INIT
CALLR D$INIT
; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
MOVEI UTIL,CMDM2
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
; (((TOPS-10)))
IFE F.TENX,<
MOVEI UTIL,CMDM1
; (!ENABLE!)
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
MOVEI UTIL,CMDM1
MOVEI REG1,400000 ; FOR THIS FORK
RPCAP
TRNE REG2,600000 ; (1B18+1B19) WHEEL OR OPER
MOVEI UTIL,CMDM2
>
; (((↑↑↑)))
>
; (((↑↑↑)))
MOVEM UTIL,CMDMOD
JRST CMDCMD
CMDNEW: TSOUT <CRLF>
CMDCMD: JRST @CMDMOD
CMDM1: TSOUT <[ASCIZ /*/]>
TCIN (CMDMC1,[ASCIZ /*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM2: TSOUT <[ASCIZ /*/]>
TCIN (CMDMC2,[ASCIZ /*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM3: TSOUT <[ASCIZ /!/]>
TCIN (CMDMC3,[ASCIZ /!/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
CALO: PATH ([ASCIZ / ALLOCATE /],PATHCC)
JRST CMDCMD
TSOUT <[ASCIZ / [Megabits:/]>
TNIN ([ASCIZ / [Megabits:/])
JRST CMDCMD
MOVEM IOREG,ABUF
JUMPN IOREG,CALO0
MOVEI IOREG,"0"
TBOUT <IOREG>
CALO0: TSOUT <[ASCIZ /]/],CRLF>
CALLR DALO
JRST CMDCMD
CATT: PATH ([ASCIZ / ATTACH /],PATHCT)
JRST CMDCMD
CALLR DATT
JRST CMDCMD
CCHA: PATH ([ASCIZ / CHANGE /],PATHCC)
JRST CMDCMD
CALLR DCHA
JRST CMDCMD
CCON: PATH ([ASCIZ / CONNECT /],PATHCA!PATHN2)
JRST CMDCMD
CALLR DCON
JRST CMDCMD
CCOP: PATH ([ASCIZ / COPY /],PATHCC!PATHRR!PATHSS!PATHPP!PATHPO)
JRST CMDCMD
CALLR DCOP
JRST CMDCMD
CCRE: PATH ([ASCIZ / CREATE /],PATHCC)
JRST CMDCMD
CALLR DCRE
JRST CMDCMD
CDEL: PATH ([ASCIZ / DELETE /],PATHCC!PATHSS!PATHST!PATHPP!PATHAC)
JRST CMDCMD
CALLR DDEL
JRST CMDCMD
CDIR: PATH ([ASCIZ / DIRECTORY /],PATHCC!PATHN1!PATHSS!PATHST)
JRST CMDCMD
MOVE IOREG,CMDMOD
CAIN IOREG,CMDM3
JRST CDIR0
TSOUT <[ASCIZ /**/]>
TCIN (CDIRC1,[ASCIZ /**/])
JRST CMDCMD
JRST CDIR1
JRST CDIR2
CDIR0: TSOUT <[ASCIZ /!!/]>
TCIN (CDIRC2,[ASCIZ /!!/])
JRST CMDCMD
JRST CDIR1
JRST CDIR2
CDIR1: TSOUT <[ASCIZ /TERSE/]>
MOVEI FLAG,DD$T
CDIR2: TSOUT <CRLF>
CALLR DDIR
JRST CMDCMD
CDIRC1: TCIL <CREATION,DD$C,TERSE,DD$T,VERBOSE,DD$V>
CDIRC2: TCIL <CREATION,DD$C,PROTECTION,DD$P,TERSE,DD$T,VERBOSE,DD$V>
CDIS: TSOUT <CRLF>
MOVEI UTIL,CMDM2
MOVEM UTIL,CMDMOD
JRST CMDCMD
CENA: TSOUT <CRLF>
MOVEI UTIL,CMDM3
MOVEM UTIL,CMDMOD
JRST CMDCMD
; (((TENEX)))
IFN F.TENX,<
CEXE: MOVEI REG1,37
PBOUT
HRRZI REG1,-1
RFMOD
MOVE R10,REG2
RFCOC
MOVE R11,REG2
MOVE R12,REG3
HRLZI REG1,(1B1) ; INFERIOR GETS THIS FORK'S CAPABILITIES
CFORK ; CREATE FORK
THUD
MOVE UTIL,REG1
HRLZI REG1,(1B2+1B17)
HRROI REG2,[ASCIZ /<SYSTEM>EXEC.SAV/]
GTJFN
THUD
HRLI REG1,(UTIL)
GET ; LOAD EXEC INTO FORK
MOVE REG1,UTIL
SETZ REG2,
SFRKV ; START FORK AT MAIN STARTUP
WFORK
KFORK
HRRZI REG1,-1
MOVE REG2,R10
SFMOD
MOVE REG2,R11
MOVE REG3,R12
SFCOC
JRST CMDCMD
>
; (((↑↑↑)))
CGET: PATH ([ASCIZ / GET /],PATHCC!PATHRL!PATHSS!PATHPO)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CLIN: TSOUT <CRLF>
CALLR DLIN
JRST CMDCMD
; (((TOPS-10)))
IFE F.TENX,<
CLOD: TTCALL 3,CRLF
SETZM LUTDSP
CLOD1: CALLR LUTDS
JRST CMDCMD
MOVEI REG1," "
TTCALL 1,REG1
TTCALL 3,ABUF
TTCALL 3,CRLF
JRST CLOD1
>
; (((↑↑↑)))
CNOD: SETZM FLAGDD
JRST CMDNEW
CPUT: PATH ([ASCIZ / PUT /],PATHCC!PATHLR!PATHSS!PATHPP!PATHPO)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CQUI: TSOUT <CRLF>
JRST QUIT
CRET: PATH ([ASCIZ / RETRIEVE /],PATHCC!PATHRL!PATHSS!PATHPO)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CSOD: SETOM FLAGDD
JRST CMDNEW
CSTO: PATH ([ASCIZ / STORE /],PATHCC!PATHLR!PATHSS!PATHPP!PATHPO)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CTTR: SETOM FLAGTT
JRST CMDNEW
CUTR: SETZM FLAGTT
JRST CMDNEW
CVER: PATH ([ASCIZ / VERIFY /],PATHCC!PATHLR!PATHSS!PATHPO)
JRST CMDCMD
CALLR DVER
JRST CMDCMD
JRST CMDCMD
; ***PATH INPUT AND TRANSLATION***
; FLAG DEFINITIONS
PATHCT==400000 ; TOP CONTEXT DEFAULT
PATHCA==200000 ; ATTACH CONTEXT DEFAULT
PATHCC==100000 ; CONNECT CONTEXT DEFAULT
PATHRR==040000 ; REMOTE [TO] REMOTE
PATHLR==020000 ; LOCAL [AS] REMOTE
PATHRL==010000 ; REMOTE [AS] LOCAL
PATHSS==004000 ; SETS -- ALLOWED
PATHST==002000 ; SETS -- TRAILING DEFAULT
PATHN1==000400 ; NULL DEFAULT ONE
PATHN2==000200 ; NULL DEFAULT TWO
PATHPO==000040 ; SECONDARY PATH -- OPEN
PATHPP==000020 ; SECONDARY PATH -- PARENT
PATHAC==000001 ; ACKNOWLEDGE-CONFIRM
; PATH INPUT CONTROL
; IN: TCIO -- LAST CHARACTER INPUT (TCIN)
; IOREG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$: BEGINR <UTIL,FLAG>
MOVE FLAG,IOREG
MOVEI IOREG," "
TBOUT <IOREG>
TLNN FLAG,PATHN1!PATHN2
JRST P$1I
CAIN TCIO,12
JRST P$1N
CAIN TCIO,37
JRST P$1N
P$1I: MOVE IOREG,[GBUF1,,5*LBUFS]
SETZ UTIL,
CALLR P$IN
RETURN
JUMPN UTIL,P$1T
P$1N: TLNN FLAG,PATHN1
JRST P$1N3
CAIN IOREG,33
JRST P$1N2
P$1N1: MOVE REG1,[ASCII /**/]
MOVEM REG1,GBUF1
TSOUT <[ASCIZ /[Nodes]/]>
JRST P$1E
P$1N2: MOVE REG1,[ASCII /</]
MOVEM REG1,GBUF1
TSOUT <[ASCIZ /[Connected Node]/]>
JRST P$1E
P$1N3: MOVE REG1,[ASCII /<</]
MOVEM REG1,GBUF1
TSOUT <[ASCIZ /[Attached Node]/]>
JRST P$1E
P$1T: TLNN FLAG,PATHST
JRST P$1E
CAIN IOREG,33
JRST P$1T1
CAIN IOREG," "
JRST P$1T1
JRST P$1E
P$1T1: MOVE REG1,[440700,,GBUF1]
ILDB REG2,REG1
CAIE REG2,"<"
JRST P$1T3
ILDB REG2,REG1
JUMPE REG2,P$1T2
CAIE REG2,"<"
JRST P$1T3
ILDB REG2,REG1
JUMPE REG2,P$1T2
CAIE REG2,"<"
JRST P$1T3
ILDB REG2,REG1
JUMPN REG2,P$1T3
P$1T2: MOVEI REG3,"*"
DPB REG3,REG1
IDPB REG3,REG1
IDPB REG2,REG1
TSOUT ([ASCIZ /[Nodes]/])
JRST P$1E
P$1T3: ILDB REG2,REG1
JUMPN REG2,P$1T3
MOVEI REG3,">"
DPB REG3,REG1
MOVEI REG3,"*"
IDPB REG3,REG1
IDPB REG3,REG1
IDPB REG2,REG1
TSOUT ([ASCIZ />[Nodes]/])
P$1E: TLNE FLAG,PATHLR!PATHRL!PATHRR
JRST P$2
TLNN FLAG,PATHAC
JRST P$1E1
TAIN <[ASCIZ / [Confirm]/]>
RETURN
RETURN
JRST P$1E2
P$1E1: TSOUT <CRLF>
P$1E2: TLNN FLAG,PATHPP
JRST P$1E3
MOVE IOREG,[GBUF1,,PBUF]
HRRZI UTIL,GBUF2
CALLR P$CS
RETURN SKIP,1
P$1E3: MOVE IOREG,[GBUF1,,PBUF]
CALLR P$CP
RETURN SKIP,1
P$2: TLNE FLAG,PATHRR
JRST P$2C
; (((TENEX)))
IFN F.TENX,<
SKIPN LFILE
JRST .+5
TLNN FLAG,PATHRL
JRST .+3
CALLR P$LF
JRST P$2MP
>
; (((↑↑↑)))
CAIN IOREG,33
JRST P$2M
CAIN IOREG," "
JRST P$2M
CALLR P$LF
JRST P$2MP
P$2C: TSOUT <[ASCIZ / [To] /]>
MOVE IOREG,[UBUF1,,5*LBUFS]
MOVE UTIL,[GBUF1,,[ASCIZ / [To] /]]
CALLR P$IN
RETURN
TSOUT <CRLF>
MOVE IOREG,[GBUF1,,GBUF2]
CALLR P$CP
MOVE IOREG,[UBUF1,,GBUF1]
HRRZI UTIL,PBUF
CALLR P$CS
MOVE IOREG,[GBUF2,,UBUF2]
CALLR P$ON
MOVE IOREG,[GBUF1,,UBUF1]
CALLR P$ON
RETURN SKIP,1
P$2M: TSOUT <[ASCIZ / [As] /]>
TLNN FLAG,PATHLR
JRST P$2ML
MOVE REG1,[GBUF1,,ABUF]
BLT REG1,<ABUF+SBUFS-1>
MOVE IOREG,[GBUF1,,5*LBUFS]
MOVE UTIL,[ABUF,,[ASCIZ / [As] /]]
CALLR P$IN
RETURN
JRST P$2MP
P$2ML: MOVE IOREG,[ABUF,,5*SBUFS]
MOVE UTIL,[GBUF1,,[ASCIZ / [As] /]]
CALLR P$IN
RETURN
; (((TOPS-10)))
IFE F.TENX,<
P$2MP: TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
P$2MP: SKIPE LJFN
JRST .+3
MOVEI REG1,37
PBOUT
>
; (((↑↑↑)))
CALLR P$LN
TLNN FLAG,PATHPP
JRST P$2M1
MOVE IOREG,[GBUF1,,PBUF]
HRRZI UTIL,GBUF2
CALLR P$CS
JRST P$2M2
P$2M1: MOVE IOREG,[GBUF1,,PBUF]
CALLR P$CP
P$2M2: MOVE IOREG,[PBUF,,ABUF]
CALLR P$ON
ENDR SKIP,1
; PATH INPUT
; IN: IOREG -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
; UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
; FLAG -- (SAME AS $PATH$)
; OUT: IOREG -- LAST CHARACTER INPUT
; UTIL -- COUNT OF CHARACTERS
; FLAGS:
P$I$AE==400000 ; ANCHOR ENCOUNTERED (<)
P$I$DE==200000 ; DESCENDER ENCOUNTERED (>,.)
P$I$GE==100000 ; GROUP ENCOUNTERED (*)
P$I$PW==040000 ; INPUT PASSWORD
P$I$CC==004000 ; <
P$I$CA==002000 ; <<
P$I$CT==001000 ; <<<
P$I$FN==000400 ; FILE NAME
;
P$IN: BEGINR <BPREG,R10,R11,R12,R13>
SETZ R10,
MOVE R11,IOREG
MOVE R12,UTIL
HLR BPREG,IOREG
HRLI BPREG,440700
SETZ UTIL,
P$ICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST P$IREP
CAIN IOREG,"A"-100
JRST P$IDEL
CAIN IOREG,"X"-100
JRST P$IENR
CAIN IOREG,177
JRST P$IENR
CAIN IOREG,15
JRST P$ICHR
CAIN IOREG,12
JRST P$IEND
CAIN IOREG,33
JRST P$IEND
CAIN IOREG,37
JRST P$IEND
CAIGE IOREG," "
JRST P$IBAD
CAIN IOREG,42
JRST P$IBAD
CAIL UTIL,(R11)
JRST P$IBAD
TRNE R10,P$I$PW
JRST P$ICHP
CAIN IOREG," "
JRST P$IEND
CAIN IOREG,":"
JRST P$IPON
CAIN IOREG,"'"
JRST P$IPON
CAIN IOREG,"?"
JRST P$IBAD
CAIN IOREG,"<"
JRST P$ISA
CAIN IOREG,">"
JRST P$ISD1
CAIN IOREG,"."
JRST P$ISD2
CAIN IOREG,"*"
JRST P$ISG
TRNE R10,P$I$GE
JRST P$IBAD
TRZ R10,P$I$AE!P$I$DE
P$ICHE: IDPB IOREG,BPREG
TBOUT <IOREG>
AOJA UTIL,P$ICHR
P$ICHP: CAIN IOREG,">"
JRST P$IPOF
CAIN IOREG,"'"
JRST P$IBAD
IDPB IOREG,BPREG
AOJA UTIL,P$ICHR
P$ISA: TRNN R10,P$I$CC
JRST P$ISA1
TRNN R10,P$I$CA
JRST P$ISA2
TRNN R10,P$I$CT
JRST P$ISA3
JRST P$IBAD
P$ISA1: JUMPN UTIL,P$IBAD
TRO R10,P$I$AE!P$I$CC
JRST P$ICHE
P$ISA2: CAIE UTIL,1
JRST P$IBAD
TRO R10,P$I$AE!P$I$CA
JRST P$ICHE
P$ISA3: CAIE UTIL,2
JRST P$IBAD
TRO R10,P$I$AE!P$I$CT
JRST P$ICHE
P$ISD1: JUMPE UTIL,P$IBAD
TRNE R10,P$I$FN
JRST P$IBAD
TRNE R10,P$I$AE
JRST P$IBAD
TROE R10,P$I$DE
JRST P$IBAD
TRZ R10,P$I$GE
JRST P$ICHE
P$ISD2: JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE
JRST P$IBAD
TROE R10,P$I$DE!P$I$FN
JRST P$IBAD
TRZ R10,P$I$GE
JRST P$ICHE
P$ISG: TRZN R10,P$I$AE!P$I$DE
JUMPN UTIL,P$IBAD
TRO R10,P$I$GE
JRST P$ICHE
P$IPON: TRNE R10,P$I$AE!P$I$DE!P$I$GE
JRST P$IBAD
MOVEI REG1,1(UTIL)
CAIL REG1,(R11)
JRST P$IBAD
IDPB IOREG,BPREG
TBOUT <IOREG>
MOVEI REG1,"P"-100
IDPB REG1,BPREG
ADDI UTIL,2
TRO R10,P$I$PW
JRST P$ICHR
P$IPOF: MOVEI REG1,1(UTIL)
CAIL REG1,(R11)
JRST P$IBAD
MOVEI REG1,"P"-100
IDPB REG1,BPREG
IDPB IOREG,BPREG
TBOUT <IOREG>
ADDI UTIL,2
TRZ R10,P$I$PW
TRO R10,P$I$DE
JRST P$ICHR
P$IBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST P$ICHR
P$IREP: TSOUT <CRLF>
TSOUT <(FLAG)>
JUMPE R12,P$IR04
HLR R13,R12
HRLI R13,440700
TRZ R10,P$I$PW
P$IR01: ILDB IOREG,R13
JUMPE IOREG,P$IR03
CAIN IOREG,"P"-100
JRST P$IR02
TRNE R10,P$I$PW
JRST P$IR01
TBOUT <IOREG>
JRST P$IR01
P$IR02: TRC R10,P$I$PW
JRST P$IR01
P$IR03: TSOUT <(R12)>
P$IR04: HRRZI IOREG,(BPREG)
HLR R13,R11
CAIGE IOREG,(R13)
JRST P$ICHR
HRLI R13,440700
TRZ R10,P$I$PW
P$IR05: CAMN R13,BPREG
JRST P$ICHR
ILDB IOREG,R13
CAIN IOREG,"P"-100
JRST P$IR06
TRNE R10,P$I$PW
JRST P$IR05
TBOUT <IOREG>
JRST P$IR05
P$IR06: TRC R10,P$I$PW
JRST P$IR05
P$IDEL: JUMPE UTIL,P$IBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
CAIN IOREG,"P"-100
JRST P$ID01
LDB REG1,BPREG
CAIN REG1,"P"-100
JRST P$ID02
TRNE R10,P$I$PW
SOJA UTIL,P$ICHR
TBOUT <IOREG>
TRZ R10,P$I$AE!P$I$DE!P$I$GE
CAIN IOREG,"."
TRZ R10,P$I$FN
CAIE IOREG,"<"
JRST P$ID00
TRZE R10,P$I$CT
JRST P$ID00
TRZE R10,P$I$CA
JRST P$ID00
TRZ R10,P$I$CC
P$ID00: SUBI UTIL,1
JUMPE UTIL,P$ICHR
LDB REG1,BPREG
CAIN REG1,"<"
TRO R10,P$I$AE
CAIN REG1,">"
TRO R10,P$I$DE
CAIN REG1,"."
TRO R10,P$I$DE
CAIN REG1,"*"
TRO R10,P$I$GE
JRST P$ICHR
P$ID01: TRZ R10,P$I$PW
LDB IOREG,BPREG
JRST P$ID03
P$ID02: TROE R10,P$I$PW
SOJA UTIL,P$ICHR
P$ID03: SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
TBOUT <IOREG>
SUBI UTIL,2
JRST P$ICHR
P$IENR: TSOUT <[ASCIZ /XXX/],CRLF>
SETO IOREG,
SETZ UTIL,
RETURN
P$IEND: TRNE R10,P$I$DE
JRST P$IBAD
; (((TENEX)))
IFN F.TENX,<
TLNN FLAG,PATHLR!PATHRL
JRST P$IENN
JUMPN UTIL,P$IENN
CAIG R12,-1
JRST .+3
TLNE FLAG,PATHLR
JRST P$IBAD ; PUT -- SECOND ARGUMENT
MOVEI REG1,76
PBOUT
TLNE FLAG,PATHLR
HRLZI REG1,160003 ; OLD,MSG,CONFIRM,JFN,SHORT
TLNE FLAG,PATHRL
HRLZI REG1,660003 ; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
MOVE REG2,[100,,101]
GTJFN
JRST P$IENR
MOVEM REG1,LJFN
HRROI REG1,LFILE
MOVE REG2,LJFN
SETZ REG3,
JFNS
MOVEI REG1,100
BKJFN
THUD
PBIN
MOVEI IOREG,(REG1)
CAILE R12,-1
JRST P$IENE ; GET -- SECOND ARGUMENT
HLRO REG1,R11
MOVE REG2,LJFN
MOVE REG3,[1B8+1B11+1B35] ; NAME,EXT,PUNCTUATION
TLNN FLAG,PATHLR
JRST .+5
CAIN IOREG,33
SETZ REG3,
CAIN IOREG," "
SETZ REG3,
JFNS ; FIRST ARGUMENTS
JUMPE REG3,P$IENE
LDB REG2,REG1
CAIE REG2,"."
JRST P$IENE
SETZ REG2,
DPB REG2,REG1
P$IENE: MOVE REG1,LJFN
RLJFN
THUD
MOVEI UTIL,-1(R11)
SETZM LJFN
CAIN IOREG,12
SETOM LJFN
CAIN IOREG,37
SETOM LJFN
RETURN SKIP,1
P$IENN: SETZM LFILE
SETZM LJFN
>
; (((↑↑↑)))
TLNN FLAG,PATHN1!PATHN2
JUMPE UTIL,P$IBAD
SETZ R13,
IDPB R13,BPREG
ENDR SKIP,1
; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
; IN: IOREG -- SOURCE,,DESTINATION
; FLAG -- PATH CONTEXT FLAGS
;
P$CP: BEGINR <IOREG,FLAG>
MOVEI REG1,<<LBUFS*5>-1>
HLR REG2,IOREG
HRLI REG2,350700
HRRI REG3,(IOREG)
HRLI REG3,440700
LDB IOREG,REG2
CAIN IOREG,"<"
JRST P$CPCX
TLNE FLAG,PATHCT
JRST P$CPCT
TLNE FLAG,PATHCA
JRST P$CPCA
JRST P$CPCC
P$CPCX: ILDB IOREG,REG2
CAIE IOREG,"<"
JRST P$CPCC
ILDB IOREG,REG2
CAIE IOREG,"<"
JRST P$CPCA
ILDB IOREG,REG2
P$CPCT: MOVE REG4,[440700,,[ASCIZ /%TOP./]]
SCOPY (REG4,REG3)
MOVE REG4,[440700,,ANCHOR]
SCOPY (REG4,REG3)
SUBI REG1,11
JRST P$CPCE
P$CPCA: MOVE REG4,[440700,,[ASCIZ /%LOGIN/]]
SCOPY (REG4,REG3)
SUBI REG1,6
JRST P$CPCE
P$CPCC: MOVE REG4,[440700,,CONTEX]
ILDB 0,REG4
JUMPE 0,.+4
SOJL REG1,P$CPE
IDPB 0,REG3
JRST .-4
MOVE REG4,REG3
IDPB 0,REG4
P$CPCE: JUMPE IOREG,P$CPZ0
MOVEI REG4,"."
IDPB REG4,REG3
SUBI REG1,1
MOVEI REG4,42
SETZ FLAG,
JRST P$CPI0
P$CPI: ILDB IOREG,REG2
P$CPI0: CAIN IOREG,"P"-100
JRST P$CPI
CAIN IOREG,">"
JRST P$CPS
CAIN IOREG,"."
JRST P$CPS
JUMPE IOREG,P$CPZ
JUMPN FLAG,P$CPO
CAIN IOREG,":"
JRST P$CPP
CAIN IOREG,"'"
JRST P$CPP
CAIN IOREG,"*"
JRST P$CPO
CAIGE IOREG,"A"
JRST P$CPQ
CAILE IOREG,"Z"
JRST P$CPQ
P$CPO: SOJL REG1,P$CPE
IDPB IOREG,REG3
JRST P$CPI
P$CPQ: SOJL REG1,P$CPE
IDPB REG4,REG3
JRST P$CPO
P$CPS: JUMPE FLAG,.+6
MOVEI IOREG,"'"
IDPB IOREG,REG3
MOVEI IOREG,")"
IDPB IOREG,R3
SETZ FLAG,
MOVEI IOREG,"."
JRST P$CPO
P$CPP: SUBI REG1,4
JUMPL REG1,P$CPE
MOVEI IOREG,"("
IDPB IOREG,R3
MOVEI IOREG,"'"
IDPB IOREG,R3
SETO FLAG,
JRST P$CPI
P$CPE: TSOUT <[ASCIZ / (Pathname too long.)/],CRLF>
MOVE STAK,[IOWD STSIZ,STBEG]
JRST CMDCMD
P$CPZ: JUMPE FLAG,.+5
MOVEI REG1,"'"
IDPB REG1,REG3
MOVEI REG1,")"
IDPB REG1,REG3
P$CPZ0: IDPB IOREG,REG3
ENDR
; CONVERT PATH -- SUPERIOR (IF ANY) AND COMPLETE PATH
; IN: IOREG -- SOURCE,,DESTINATION
; UTIL -- DESTINATION OF SUPERIOR PATH
;
P$CS: BEGINR <BPREG,UTIL>
HLR REG1,IOREG
HRLI REG1,440700
MOVE REG2,REG1
SETZM (UTIL)
P$CS1: ILDB REG3,REG2
JUMPE REG3,P$CS2
CAIN REG3,">"
MOVE REG1,REG2
CAIN REG3,"<"
MOVE REG1,REG2
JRST P$CS1
P$CS2: ILDB REG2,REG1
JUMPE REG2,P$CS3
CAIE REG2,"."
JRST P$CS2
MOVE BPREG,REG1
SETZ REG1,
DPB REG1,BPREG
HRLI UTIL,(IOREG)
HRRI IOREG,(UTIL)
CALLR P$CP
HLR IOREG,UTIL
MOVEI REG1,">"
DPB REG1,BPREG
P$CS3: CALLR P$CP
ENDR
; DATACOMPUTER OPEN NODE NAME
; IN: IOREG -- SOURCE,,DESTINATION
;
P$ON: BEGINR
HLR REG1,IOREG
HRLI REG1,440700
MOVE REG2,REG1
P$ONI: ILDB REG3,REG2
JUMPE REG3,P$ONM
CAIN REG3,"."
MOVE REG1,REG2
CAIN REG3,42
IBP REG2
JRST P$ONI
P$ONM: HRRI REG2,(IOREG)
HRLI REG2,440700
P$ONM1: ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,P$ONM1
ENDR
; LOCAL FILE NAME FIND
;
P$LF: BEGINR
MOVE REG1,[440700,,GBUF1]
MOVE REG2,[440700,,GBUF1]
P$LFI: ILDB REG3,REG2
JUMPE REG3,P$LFM
CAIN REG3,">"
MOVE REG1,REG2
CAIN REG3,"<"
MOVE REG1,REG2
JRST P$LFI
P$LFM: MOVE REG2,[440700,,ABUF]
P$LFM1: ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,P$LFM1
ENDR
; LOCAL FILE NAME PREPARATION
;
P$LN: BEGINR <IOREG>
; (((TOPS-10)))
IFE F.TENX,<
HRRZI IOREG,ABUF
CALLR LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
SKIPE LFILE
RETURN
MOVE IOREG,[ABUF,,LFILE]
BLT IOREG,<LFILE+SBUFS-1>
>
; (((↑↑↑)))
ENDR
; ***DATACOMPUTER INTERFACE ROUTINES***
; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT: BEGINR <IOREG,BPREG,UTIL,FLAG>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$IN0
TSOUT <[ASCIZ / ?? DATACOMPUTER INITIALIZATION FAILURE ??/],CRLF>
JRST QUIT
D$IN0: TSOUT <[ASCIZ / [Attaching]/],CRLF>
HRRZI UTIL,HOSTS
D$IN1: SKIPN (UTIL)
JRST D$IND
HLRZ REG1,(UTIL)
CAME REG1,LHOST
AOJA UTIL,D$IN1
MOVE IOREG,[440700,,[ASCIZ /%TOP.DFTP./]]
MOVE BPREG,[440700,,ABUF]
SCOPY (IOREG,BPREG)
HRR IOREG,(UTIL)
HRLI IOREG,440700
SCOPY (IOREG,BPREG)
MOVEI IOREG,"."
IDPB IOREG,BPREG
; (((TOPS-10)))
IFE F.TENX,<
MOVE REG1,[-1,,31]
MOVE REG2,[-1,,32]
GETTAB REG1,
THUD
GETTAB REG2,
THUD
MOVEM REG1,UBUF1
MOVEM REG2,<UBUF1+1>
SETZM <UBUF1+2>
MOVE REG1,[440600,,UBUF1]
MOVEI REG2,42
ILDB REG3,REG1
JUMPE REG3,.+7
ADDI REG3,40
CAIL REG3,"A"
CAILE REG3,"Z"
IDPB REG2,BPREG
IDPB REG3,BPREG
JRST .-7
MOVE REG1,BPREG
IDPB REG3,REG1
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
GJINF
CAMN REG1,REG2
JRST .+10
HRROI REG1,[ASCIZ / (from /]
PSOUT
MOVEI REG1,101
DIRST
THUD
HRROI REG1,[ASCIZ /)
/]
PSOUT
HRROI REG1,UBUF1
DIRST
THUD
MOVE REG1,[440700,,UBUF1]
MOVEI REG2,42
ILDB REG3,REG1
JUMPE REG3,.+6
CAIL REG3,"A"
CAILE REG3,"Z"
IDPB REG2,BPREG
IDPB REG3,BPREG
JRST .-6
MOVE REG1,BPREG
IDPB REG3,REG1
>
; (((↑↑↑)))
DCSOUT <[ASCIZ /LOGIN /],ABUF,SEMI>
CALLR RENDER
JRST .+2
JRST D$INP
DCSOUT <[ASCIZ /LIST /],ABUF,SEMI>
CALLR RENDER
JRST D$IND
MOVEI FLAG,3
D$IN2: TSOUT <[ASCIZ / [Password:/]>
TSIN (UBUF1,LBUFS,<[ASCIZ / [Password:/]>,NOECHO)
JRST D$IN2
TSOUT <[ASCIZ /]/],CRLF>
MOVE REG2,BPREG
MOVEI REG1,"("
IDPB REG1,REG2
MOVEI REG1,"'"
IDPB REG1,REG2
MOVE REG1,[440700,,UBUF1]
SCOPY (REG1,REG2)
MOVEI REG1,"'"
IDPB REG1,REG2
MOVEI REG1,")"
IDPB REG1,REG2
SETZ REG1,
IDPB REG1,REG2
DCSOUT <[ASCIZ /LOGIN /],ABUF,SEMI>
CALLR RENDER
JRST .+2
JRST D$INP
TSOUT <[ASCIZ / (Incorrect password.)/],CRLF>
SOJG FLAG,D$IN2
TSOUT <[ASCIZ / [Attaching]/],CRLF>
D$IND: MOVE REG1,[440700,,[ASCIZ /%TOP.DFTP.DFTP.GUEST/]]
MOVE REG2,[440700,,ABUF]
SCOPY (REG1,REG2)
DCSOUT <[ASCIZ /LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
TSOUT <[ASCIZ / (as DFTP.GUEST)/],CRLF>
D$INP: DCSOUT <[ASCIZ /OPEN %TOP.DFTP."<PORT"> WRITE/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
MOVE REG1,[ASCII /%LOGI/]
MOVEM REG1,CONTEX
MOVE REG1,[ASCII /N/]
MOVEM REG1,<CONTEX+1>
ENDR
; DALO -- ALLOCATE SPACE
;
DALO: BEGINR
DCSOUT <[ASCIZ /MODIFY /],PBUF,<[ASCIZ /,M=/]>>
MOVE IOREG,ABUF
DCNOUT <IOREG>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
ENDR
; DATT -- LOGIN TO NODE
;
DATT: BEGINR
DCSOUT <[ASCIZ /CLOSE %OPEN/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ /LOGIN /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ /OPEN %TOP.DFTP."<PORT"> WRITE/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
MOVE REG1,[ASCII /%LOGI/]
MOVEM REG1,CONTEX
MOVE REG1,[ASCII /N/]
MOVEM REG1,<CONTEX+1>
ENDR
; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA: BEGINR <IOREG,UTIL>
DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %PRIV/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCHAD: DCSOUT <[ASCIZ /DELETEP /],PBUF,<[ASCIZ /,N=1/]>,SEMI>
CALLR RENDER
JRST .+2
JRST DCHAD
TSOUT <[ASCIZ / [OK]/],CRLF>
DCHAI: TAIN <[ASCIZ / Add a new privilege? /]>
RETURN
RETURN
SETZM ABUF ; WRITE FLAG
SETZM <ABUF+1> ; HOST
SETOM <ABUF+2> ; SOCKET
SETOM <ABUF+3> ; PASSWORD
TAIN <[ASCIZ / Allow control? /]>
JRST DCHAI
SETOM ABUF
TAIN <[ASCIZ / Restrict via network? /]>
JRST DCHAI
JRST DCHAI3
TSOUT <[ASCIZ / Site: /]>
TNIN ([ASCIZ / Site: /],10)
JRST DCHAI
JUMPE IOREG,DCHAI1
MOVEM IOREG,<ABUF+1>
TSOUT <CRLF>
TSOUT <[ASCIZ / Socket: /]>
TNIN ([ASCIZ / Socket: /],10)
JRST DCHAI
JUMPN IOREG,DCHAI2
TSOUT <[ASCIZ /(Any)/]>
JRST DCHAI2
DCHAI1: MOVE IOREG,LHOST
MOVEM IOREG,<ABUF+1>
TSOUT <[ASCIZ /(Local)/],CRLF>
TSOUT <[ASCIZ / User: /]>
; (((TOPS-10)))
IFE F.TENX,<
TNIN ([ASCIZ / User: /],10)
JRST DCHAI
LSH IOREG,11
ADDI IOREG,100
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
TSIN (UBUF1,LBUFS,[ASCIZ / User: /])
JRST DCHAI
SETZ REG1,
MOVE REG2,[440700,,UBUF1]
STDIR
JRST .+3
JRST .+2
JRST .+4
HRROI REG1,[ASCIZ / (User not found.)
/]
PSOUT
JRST DCHAI
HRRZI IOREG,(REG1)
LSH IOREG,↑D15
ADDI IOREG,20
>
; (((↑↑↑)))
DCHAI2: MOVEM IOREG,<ABUF+2>
TSOUT <CRLF>
DCHAI3: TAIN <[ASCIZ / Restrict via password? /]>
JRST DCHAI
JRST DCHAC
TSOUT <[ASCIZ / Password: /]>
TSIN (<ABUF+3>,<SBUFS-3>,[ASCIZ / Password: /])
JRST DCHAI
TSOUT <CRLF>
DCHAC: DCSOUT <[ASCIZ /CREATEP /],PBUF,<[ASCIZ /,U=**,G=LR/]>>
SKIPE ABUF
JRST DCHAC1
DCSOUT <[ASCIZ /C/]>
DCHAC1: SKIPN <ABUF+1>
JRST DCHAC3
DCSOUT <<[ASCIZ /,H=/]>>
MOVE IOREG,<ABUF+1>
DCNOUT <IOREG>
DCSOUT <<[ASCIZ /,S=/]>>
MOVE IOREG,<ABUF+2>
JUMPE IOREG,DCHAC2
DCNOUT <IOREG>
JRST DCHAC3
DCHAC2: DCSOUT <[ASCIZ /ANY/]>
DCHAC3: SETO IOREG,
CAMN IOREG,<ABUF+3>
JRST DCHAC4
DCSOUT <<[ASCIZ /,P='/]>,<ABUF+3>,[ASCIZ /'/]>
DCHAC4: DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
TSOUT <[ASCIZ / [OK]/],CRLF>
JRST DCHAI
ENDR
; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON: BEGINR
DCSOUT <[ASCIZ /LIST /],PBUF,SEMI>
CALLR RENDER
JRST DCON1
TSOUT <[ASCIZ / [Old Node]/],CRLF>
JRST DCON2
RETURN
DCON1: TAIN <[ASCIZ / [New Node][Confirm]/]>
RETURN
RETURN
DCSOUT <[ASCIZ /CREATE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCON2: MOVE REG1,[440700,,PBUF]
MOVE REG2,[440700,,CONTEX]
SCOPY (REG1,REG2)
ENDR
; DCOP -- COPY FILES WITHIN THE DATACOMPUTER
;
DCOP: BEGINR <FLAG>
SETZ FLAG,
MOVE REG1,[440700,,UBUF1]
MOVE REG2,[440700,,UBUF2]
ILDB REG3,REG1
ILDB REG4,REG2
CAIE REG3,(REG4)
JRST DCOP0
JUMPN REG3,.-4
CALLR DCOP$T
RETURN
DCOP0: DCSOUT <[ASCIZ /OPEN /],GBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ /LIST /],GBUF1,SEMI>
CALLR RENDER
JRST DCOP1
TAIN <[ASCIZ / [Old File][Confirm]/]>
JRST DCOPE3
JRST DCOPE3
DCSOUT <[ASCIZ /DELETE /],GBUF1,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE3
JRST DCOP2
DCOP1: TSOUT <[ASCIZ / [New File]/],CRLF>
SKIPN PBUF
JRST DCOP2
DCSOUT <[ASCIZ /LIST /],PBUF,SEMI>
CALLR RENDER
JRST .+2
JRST DCOP2
DCSOUT <[ASCIZ /CREATE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE2
SETO FLAG,
DCOP2: DCSOUT <[ASCIZ /CREATE /],GBUF1,[ASCIZ / LIKE /],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE2
DCSOUT <UBUF1,[ASCIZ /=/],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE1
DCSOUT <[ASCIZ /CLOSE /],UBUF1,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE1
DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN
DCOPE1: DCSOUT <[ASCIZ /DELETE /],GBUF1,SEMI>
CALLR RENDER
JRST .+1
DCOPE2: JUMPE FLAG,DCOPE3
DCSOUT <[ASCIZ /DELETE /],PBUF,SEMI>
CALLR RENDER
JRST .+1
DCOPE3: DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
CALLR RENDER
RETURN
ENDR
; ('TEMPORARY FILE' COPY)
DCOP$T: BEGINR
DCSOUT <[ASCIZ /LIST /],GBUF1,SEMI>
CALLR RENDER
JRST DCOT1
TAIN <[ASCIZ / [Old File][Confirm]/]>
RETURN
RETURN
JRST DCOT2
DCOT1: TSOUT <[ASCIZ / [New File]/],CRLF>
DCOT2: DCSOUT <[ASCIZ /OPEN /],GBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ /CREATE "<TEMPORARY" FILE"> LIKE /],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE1
DCSOUT <[ASCIZ /"<TEMPORARY" FILE">=/],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE2
DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE4
DCSOUT <[ASCIZ /DELETE /],GBUF1,SEMI>
CALLR RENDER
JRST .+1
SKIPN PBUF
JRST DCOT3
DCSOUT <[ASCIZ /LIST /],PBUF,SEMI>
CALLR RENDER
JRST .+2
JRST DCOT3
DCSOUT <[ASCIZ /CREATE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE3
SETO FLAG,
DCOT3: DCSOUT <[ASCIZ /CREATE /],GBUF1,[ASCIZ / LIKE "<TEMPORARY" FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE4
DCSOUT <UBUF1,[ASCIZ /="<TEMPORARY" FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE3
DCSOUT <[ASCIZ /CLOSE /],UBUF1,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE3
DCSOUT <[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN
DCOTE1: DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
CALLR RENDER
RETURN
RETURN
DCOTE2: DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
CALLR RENDER
JRST DCOTE4
JRST DCOTE4
DCOTE3: DCSOUT <[ASCIZ /DELETE /],GBUF1,SEMI>
CALLR RENDER
JRST .+1
JUMPE FLAG,DCOTE4
DCSOUT <[ASCIZ /DELETE /],PBUF,SEMI>
CALLR RENDER
JRST .+1
DCOTE4: DCSOUT <[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
CALLR RENDER
RETURN
ENDR
; DCRE -- CREATE NEW NODE
;
DCRE: BEGINR
DCSOUT <[ASCIZ /CREATE /],PBUF,<[ASCIZ /,M=/]>>
MOVEI IOREG,DEFALO
DCNOUT <IOREG>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
CALLR DCHA
ENDR
; DDEL -- DELETE NODES/FILES
;
DDEL: BEGINR
DCSOUT <[ASCIZ /DELETE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DDEL0
SKIPN GBUF2
JRST DDEL0
DCSOUT <[ASCIZ /DELETE /],GBUF2,SEMI>
CALLR RENDER
JRST .+1
DDEL0: DCSOUT <[ASCIZ /LIST /],CONTEX,SEMI>
CALLR RENDER
JRST .+2
RETURN
TSOUT <[ASCIZ / [Connected To Attached Node]/],CRLF>
MOVE REG1,[ASCII /%LOGI/]
MOVEM REG1,CONTEX
MOVE REG1,[ASCII /N/]
MOVEM REG1,<CONTEX+1>
ENDR
; DDIR -- LIST THE DIRECTORY
; IN: FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR: BEGINR <IOREG,UTIL>
SETZ UTIL,
SETZM GBUF1
MOVE REG1,[GBUF1,,GBUF1+1]
BLT REG1,<GBUF1+LBUFS-1>
MOVEI REG1,<GBUF2+1>
MOVEM REG1,GBUF2
; (((TENEX)))
IFN F.TENX,<
SETZM FLAGCO
>
; (((↑↑↑)))
CAIN FLAG,DD$C
JRST DDIRO1
CAIN FLAG,DD$P
JRST DDIRO2
CAIN FLAG,DD$T
JRST DDIRO3
CAIN FLAG,DD$V
JRST DDIRO4
RETURN
DDIRO1: DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %SOURCE/],SEMI>
JRST DDIRI
DDIRO2: DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %PRIVILEGE/],SEMI>
JRST DDIRI
DDIRO3: DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %NAME/],SEMI>
JRST DDIRI
DDIRO4: DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %INFORMATION/],SEMI>
DDIRI: CALLR RENPRE
CAMN IOREG,[ASCII /.I280/]
JRST DDIRD
CALLR RENLIP
JRST DDIRER
; (((TOPS-10)))
IFE F.TENX,<
DDIRN: DCBIN <IOREG>
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
DDIRN: SKIPN FLAGCO
JRST DDIRN0
HRROI REG1,[ASCIZ / [Aborting]
/]
PSOUT
MOVE REG1,DCOJFN
MOVEI REG2,22
MTOPR
CALLR RENDER
JRST .+1
DCSOUT <SEMI>
JRST DDIRER
DDIRN0: DCBIN <IOREG>
>
; (((↑↑↑)))
CAIE IOREG," "
JRST DDIRE
SETO UTIL,
SKIPE FLAGDD
JRST DDIRD
CALLR <(FLAG)>
JRST DDIRN
DDIRD: CALLR RENLIN
JRST DDIRN
DDIRE: CAIN IOREG,"?"
JRST DEATH
CALLR RENLIN
JUMPN UTIL,DDIRER
TSOUT <[ASCIZ / [No Nodes]/],CRLF>
DDIRER: CALLR RENDER
RETURN
ENDR
; DD$C -- CREATION
;
DD$C: BEGINR <IOREG>
CALLR DD$NAM
JRST DD$C5
DD$C1: DCBIN <IOREG>
CAIN IOREG,15
JRST DD$C3
CAIE IOREG,"*"
JRST DD$C1
MOVEI IOREG,11
TBOUT <IOREG>
DD$C2: DCBIN <IOREG>
CAIN IOREG,15
JRST DD$C4
CAIN IOREG,"*"
JRST DD$C4
TBOUT <IOREG>
JRST DD$C2
DD$C3: TSOUT <[ASCIZ / [Undated]/]>
DD$C4: TSOUT <CRLF>
DD$C5: CALLR RENLIN
ENDR
; DD$P -- PROTECTION
;
DD$P: BEGINR <IOREG>
CALLR DD$NAM
JRST DD$P1
TSOUT <CRLF>
CALLR RENLIN
RETURN
DD$P1: MOVEI IOREG,GBUF1
DD$P2: SKIPE (IOREG)
AOJA IOREG,DD$P2
SUBI IOREG,GBUF1
DD$P3: TSOUT <[ASCIZ / /]>
SOJGE IOREG,DD$P3
MOVEI IOREG,"]"
TBOUT <IOREG>
DD$P4: DCBIN <IOREG>
TBOUT <IOREG>
CAIE IOREG,12
JRST DD$P4
ENDR
; DD$T -- TERSE
;
DD$T: BEGINR <IOREG>
CALLR DD$NAM
JRST DD$T4
DCBIN <IOREG>
CAIN IOREG,"F"
JRST DD$T1
CAIN IOREG,"P"
JRST DD$T2
JRST DD$T3
DD$T1: TSOUT <[ASCIZ / [F]/]>
JRST DD$T3
DD$T2: TSOUT <[ASCIZ / [P]/]>
DD$T3: TSOUT <CRLF>
DD$T4: CALLR RENLIN
ENDR
; DD$V -- VERBOSE
;
DD$V: BEGINR <IOREG,UTIL,FLAG>
DD$VN: DCBIN <IOREG>
CAIE IOREG,"="
JRST DD$VN
CALLR DD$NAM
JRST DD$VE
TSOUT <CRLF>
MOVEI UTIL,GBUF1
SKIPE (UTIL)
AOJA UTIL,.-1
SUBI UTIL,GBUF1
DD$VF: DCBIN <IOREG>
CAIE IOREG,"="
JRST DD$VF
DCBIN <IOREG>
SETZ FLAG,
CAIN IOREG,"F"
MOVEI FLAG,3
CAIN IOREG,"P"
MOVEI FLAG,1
CAIN IOREG,"N"
MOVEI FLAG,3
JUMPE FLAG,DD$VE
CALLR RENLIN
DD$VD: MOVEI IOREG,(UTIL)
DD$VD0: TSOUT <[ASCIZ / /]>
SOJGE IOREG,DD$VD0
MOVEI IOREG,"]"
TBOUT <IOREG>
DD$VD1: DCBIN <IOREG>
TBOUT <IOREG>
CAIE IOREG,12
JRST DD$VD1
SOJG FLAG,DD$VD
RETURN
DD$VE: CALLR RENLIN
ENDR
; DD$NAM -- DIRECTORY: NAME OUTPUT
; OUT: IOREG -- LAST CHARACTER INPUT
;
DD$NAM: BEGINR <BPREG,UTIL,FLAG,R10>
SETZ R10,
SETZ FLAG,
MOVE BPREG,[440700,,ABUF]
MOVEI UTIL,<SBUFS*5>
DCBIN <IOREG>
CAILE IOREG," "
JRST DD$NA1
RETURN
DD$NAN: DCBIN <IOREG>
DD$NA1: CAIN IOREG,"."
JRST DD$NIN
CAIG IOREG," "
JRST DD$NA3
CAIE IOREG,42
JRST DD$NA2
DCBIN <IOREG>
DD$NA2: IDPB IOREG,BPREG
SOJG UTIL,DD$NAN
JRST DD$NER
DD$NA3: SETZ REG1,
IDPB REG1,BPREG
TSOUT <[ASCIZ / /],ABUF>
RETURN SKIP,1
DD$NIN: MOVE BPREG,[440700,,ABUF]
MOVEI UTIL,<SBUFS*5>
DD$NI1: DCBIN <IOREG>
CAIN IOREG,"."
JRST DD$NCN
CAIG IOREG," "
JRST DD$NCN
DD$NI2: CAIE IOREG,42
JRST DD$NI3
DCBIN <IOREG>
DD$NI3: IDPB IOREG,BPREG
SOJG UTIL,DD$NI1
JRST DD$NER
DD$NCN: SETZ REG1,
IDPB REG1,BPREG
SKIPN REG2,GBUF1(FLAG)
JRST DD$NON
HRLI REG2,440700
MOVE REG1,[440700,,ABUF]
DD$NC1: ILDB REG3,REG1
ILDB REG4,REG2
CAIE REG3,(REG4)
JRST DD$NON
JUMPN REG3,DD$NC1
CAIG IOREG," "
RETURN SKIP,1
AOJA FLAG,DD$NIN
DD$NON: CAIL FLAG,LBUFS-2
JRST DD$NER
SETZM GBUF1+1(FLAG)
HRL REG1,GBUF1+1(FLAG)
HRR REG1,GBUF1+2(FLAG)
BLT REG1,<GBUF1+LBUFS-1>
MOVE REG1,[440700,,ABUF]
SKIPN REG2,GBUF1(FLAG)
HRR REG2,GBUF2
HRLI REG2,440700
HRRZI BPREG,(BPREG)
SUBI BPREG,<ABUF-1>
ADDI BPREG,(REG2)
CAIL BPREG,<GBUF2+LBUFS>
JRST DD$NER
HRRZM REG2,GBUF1(FLAG)
DD$NO1: ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,DD$NO1
HRRZI REG2,1(REG2)
MOVEM REG2,GBUF2
MOVEI UTIL,(FLAG)
JUMPE R10,DD$NO2
TSOUT <CRLF>
DD$NO2: TSOUT <[ASCIZ / /]>
SOJGE UTIL,DD$NO2
TSOUT <ABUF>
SETO R10,
CAIG IOREG," "
RETURN SKIP,1
AOJA FLAG,DD$NIN
DD$NER: TSOUT <[ASCIZ / (Pathname too long.)/],CRLF>
ENDR
; DGET -- GET-RETRIEVE (NETWORK TO LOCAL)
;
DGET: BEGINR <IOREG,UTIL>
DCSOUT <[ASCIZ /OPEN /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ /LIST /],ABUF,[ASCIZ / %SOURCE/],SEMI>
MOVE UTIL,[440700,,GBUF1]
CALLR RENPRE
CAME IOREG,[ASCII /.I280/]
JRST DGET3
CALLR RENLIN
DGET1: DCBIN <IOREG>
CAIN IOREG,12
JRST DGET4
CAIE IOREG,"*"
JRST DGET1
DGET2: DCBIN <IOREG>
CAIN IOREG,12
JRST DGET4
CAIN IOREG,"*"
JRST DGET3
IDPB IOREG,UTIL
JRST DGET2
DGET3: CALLR RENLIN
DGET4: SETZ IOREG,
IDPB IOREG,UTIL
CALLR RENDER
JRST .+1
CALLR NETNI
DCSOUT <[ASCIZ /CONNECT "<PORT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DGETE5
; (((TOPS-10)))
IFE F.TENX,<
CALLR LOCDG
>
; (((↑↑↑)))
CALLR LOCOO
JRST DGETE3
DCSOUT <[ASCIZ /"<PORT">=/],ABUF,SEMI>
CALLR NETOI
JRST DGETE2
CALLR RENPRE
CAME IOREG,[ASCII /;J205/]
JRST DGETE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /.I240/]
JRST DGETE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I249/]
JRST DGETE1
CALLR RENLIN
TSOUT <[ASCIZ / [OK]/],CRLF>
CALLR MOVNL
CALLR RENPRE
CAME IOREG,[ASCII /.I260/]
JRST DGETE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I269/]
JRST DGETE1
CALLR RENLIN
CALLR MOVC
CALLR NETC
; (((TENEX)))
IFN F.TENX,<
CALLR LOCDG
>
; (((↑↑↑)))
CALLR LOCC
SETOM FLAGDE
CALLR RENDER
JRST DGETE3
DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DGETE4
DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
SKIPE FLAGTT
CALLR MOVR
RETURN SKIP,1
DGETE1: LDB UTIL,[350700,,IOREG]
CAIN UTIL,"?"
JRST DEATH
CALLR RENLIP
CALLR NETC
DGETE2: CALLR RENDER
JRST .+1
CALLR LOCC
DGETE3: DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DGETE4: DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN
DGETE5: DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
ENDR
; DLIN -- DATACOMPUTER LINK
;
DLIN: BEGINR <IOREG,UTIL,FLAG>
MOVE FLAG,FLAGDD
DLINI: TSOUT (<[BYTE (7)76,0,0,0,0]>)
TSIN (ABUF,SBUFS,<[BYTE (7)76,0,0,0,0]>)
JRST DLINI
JUMPE UTIL,DLIN0
TSOUT <CRLF>
SETZM FLAGDD
DCSOUT <ABUF,CRLF>
SETOM FLAGDD
CALLR RENDER
JRST DLINI
JRST DLINI
DLIN0: CAIE IOREG,33
JRST DLINE
TSOUT <CRLF>
DLINA: TSOUT <[ASCIZ /$/]>
TSIN (ANCHOR,SBUFS,[ASCIZ /$/])
JRST DLINI
TSOUT <CRLF>
JUMPE UTIL,DLINA
JRST DLINI
DLINE: TSOUT <[ASCIZ /[Returning]/],CRLF>
MOVEM FLAG,FLAGDD
ENDR
; DPUT -- PUT-STORE (LOCAL TO NETWORK)
;
DPUT: BEGINR <IOREG,UTIL,FLAG>
SETZ FLAG,
CALLR LOCOI
RETURN
CALLR LOCDP
CALLR LOCS
JUMPG UTIL,DPUT1
TSOUT <[ASCIZ / (Empty local file.)/],CRLF>
JRST DPUTE6
DPUT1: CAMG UTIL,[SIZPAG*SIZFIL]
JRST DPUT2
TSOUT <[ASCIZ / (Local file too large.)/],CRLF>
JRST DPUTE6
DPUT2: DCSOUT <[ASCIZ /LIST /],PBUF,SEMI>
CALLR RENDER
JRST DPUT3
TAIN <[ASCIZ / [Old File][Confirm]/]>
JRST DPUTE6
JRST DPUTE6
DCSOUT <[ASCIZ /DELETE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE6
JRST DPUT4
DPUT3: TSOUT <[ASCIZ / [New File]/],CRLF>
SKIPN GBUF2
JRST DPUT4
DCSOUT <[ASCIZ /LIST /],GBUF2,SEMI>
CALLR RENDER
JRST .+2
JRST DPUT4
DCSOUT <[ASCIZ /CREATE /],GBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE6
SETO FLAG,
DPUT4: DCSOUT <[ASCIZ /CREATE /],PBUF,<[ASCIZ / FILE STRING (0,/]>>
DCNOUT <UTIL>
DCSOUT <<[ASCIZ \),B=36,S=BINARY /*\]>,GBUF1,[ASCIZ \*/\],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE5
CALLR NETNO
DCSOUT <[ASCIZ /CONNECT "<PORT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE4
DCSOUT <ABUF,[ASCIZ /="<PORT">/],SEMI>
CALLR NETOO
JRST DPUTE3
CALLR RENPRE
CAME IOREG,[ASCII /;J205/]
JRST DPUTE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /.I230/]
JRST DPUTE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I239/]
JRST DPUTE1
CALLR RENLIN
CALLR MOVLN
CALLR NETC
CALLR RENPRE
CAME IOREG,[ASCII /.I250/]
JRST DPUTE2
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I259/]
JRST DPUTE2
CALLR RENLIN
CALLR MOVC
CALLR LOCC
SETOM FLAGDE
CALLR RENDER
JRST DPUTE7
DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE7
DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
SKIPE FLAGTT
CALLR MOVR
RETURN SKIP,1
DPUTE1: CALL NETC
DPUTE2: LDB UTIL,[350700,,IOREG]
CAIN UTIL,"?"
JRST DEATH
CALLR RENLIP
DPUTE3: CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DPUTE4: DCSOUT <[ASCIZ /DELETE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DPUTE5: JUMPE FLAG,DPUTE6
DCSOUT <[ASCIZ /DELETE /],GBUF2,SEMI>
CALLR RENDER
JRST .+1
DPUTE6: CALLR LOCC
RETURN
DPUTE7: DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ /DELETE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ /DELETE /],GBUF2,SEMI>
CALLR RENDER
RETURN
ENDR
; DVER -- VERIFY EQUIVALENCE OF LOCAL AND REMOTE DATA
;
DVER: BEGINR <IOREG,UTIL>
CALLR LOCOI
RETURN
DCSOUT <[ASCIZ /OPEN /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DVERE6
CALLR NETNI
DCSOUT <[ASCIZ /CONNECT "<PORT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DVERE5
DCSOUT <[ASCIZ /"<PORT">=/],ABUF,SEMI>
CALLR NETOI
JRST DVERE2
CALLR RENPRE
CAME IOREG,[ASCII /;J205/]
JRST DVERE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /.I240/]
JRST DVERE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I249/]
JRST DVERE1
CALLR RENLIN
CALLR MOVV
CALLR RENPRE
CAME IOREG,[ASCII /.I260/]
JRST DVERE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I269/]
JRST DVERE1
CALLR RENLIN
CALLR MOVC
CALLR NETC
SETOM FLAGDE
CALLR RENDER
JRST DVERE3
DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DVERE4
DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
CALLR LOCC
RETURN SKIP,1
DVERE1: LDB UTIL,[350700,,IOREG]
CAIN UTIL,"?"
JRST DEATH
CALLR RENLIP
CALLR NETC
DVERE2: CALLR RENDER
JRST .+1
DVERE3: DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DVERE4: DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
CALLR LOCC
RETURN
DVERE5: DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DVERE6: CALLR LOCC
ENDR
; MOVC -- CHECKSUM TEST
;
MOVC: BEGINR <IOREG,FLAG>
CALLR RENPRE
CAME IOREG,[ASCII /;I275/]
JRST MOVC2
SETZ FLAG,
MOVC1: DCBIN <IOREG>
CAIE IOREG,"="
JRST MOVC1
SKIPN FLAG
SOJA FLAG,MOVC1
CALLR DCNIN
CAME IOREG,MOVSUM
JRST MOVC3
CALLR RENLIN
RETURN
MOVC2: CALLR RENLIP
RETURN
MOVC3: TSOUT <[ASCIZ / (Network Checksum Error.)/],CRLF>
CALLR RENLIN
ENDR
; MOVR -- CALCULATE AND PRINT MOVE RATE
;
MOVR: BEGINR <IOREG,<IOREG+1>>
TSOUT <[ASCIZ / (/]>
MOVEI IOREG,↑D36
IMULB IOREG,MOVSPA
IDIV IOREG,MOVTIM
TNOUT <IOREG>
TSOUT <[ASCIZ / Baud (/]>
MOVE IOREG,MOVSPA
TNOUT <IOREG>
TSOUT <[ASCIZ / bits in /]>
MOVE IOREG,MOVTIM
CAIN IOREG,0
MOVEI IOREG,1
TNOUT <IOREG>
HRRZI <IOREG+1>,[ASCIZ / seconds))/]
CAIN IOREG,1
HRRZI <IOREG+1>,[ASCIZ / second))/]
TSOUT <(IOREG+1),CRLF>
ENDR
; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER: BEGINR <IOREG,UTIL,FLAG>
SETZ FLAG,
RENDIL: CALLR RENPRE
CAMN IOREG,[ASCII /.I220/]
JRST RENDES
CAMN IOREG,[ASCII /.I210/]
JRST RENDRR
LDB UTIL,[350700,,IOREG]
CAIN UTIL,"?"
JRST DEATH
CAIN UTIL,"!"
JRST RENDPM
SKIPE FLAGDE
JRST RENDPT
RENDNM: CALLR RENLIN
JRST RENDIL
RENDPT: SETZM FLAGDE
CAIN UTIL,";"
JRST RENDNM
CAIN UTIL,"."
JRST RENDNM
RENDPM: CALLR RENLIP
JRST RENDIL
RENDES: CALLR RENLIN
MOVEI IOREG,"L"-100
DCBOUT <IOREG>
AOJA FLAG,RENDIL
RENDRR: CALLR RENLIN
JUMPN FLAG,RETN(0)
ENDR SKIP,1
; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN: BEGINR <IOREG>
RENLNL: DCBIN <IOREG>
CAIE IOREG,12
JRST RENLNL
ENDR
; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP: BEGINR <IOREG>
SKIPN FLAGDD
JRST RENLPF
RENLPL: DCBIN <IOREG>
CAIE IOREG,12
JRST RENLPL
RETURN
RENLPF: DCBIN <IOREG>
CAIN IOREG,12
RETURN
CAIE IOREG,11
JRST RENLPF
MOVEI IOREG," "
TBOUT <IOREG>
MOVEI IOREG,"("
RENLPP: TBOUT <IOREG>
DCBIN <IOREG>
CAIE IOREG,15
JRST RENLPP
DCBIN <IOREG>
MOVEI IOREG,")"
TBOUT <IOREG>
TSOUT <CRLF>
ENDR
; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
; OUT: IOREG -- ASCII PREFIX (5 BYTES)
;
RENPRE: BEGINR <BPREG,UTIL,FLAG>
SETZ IOREG,
MOVE BPREG,[440700,,IOREG]
MOVEI FLAG,5
RENPRL: DCBIN <UTIL>
CAIN UTIL,15
JRST RENPRL
CAIN UTIL,12
JRST RENPRL
IDPB UTIL,BPREG
SOJG FLAG,RENPRL
ENDR
; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH: CALLR RENLIP
TSOUT <[ASCIZ / ?? FATAL DATACOMPUTER ERROR ??/],CRLF>
; (((TOPS-10)))
IFE F.TENX,<
EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
HALTF
JRST .-1
>
; (((↑↑↑)))
; ***I/O ROUTINES***
; TAIN -- TERMINAL AUTHORIZATION INPUT
; IN: REG1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$: BEGINR <IOREG>
MOVEI IOREG,(REG1)
TSOUT <(IOREG)>
TAIN1: TBIN <IOREG>
CAIN IOREG,15
JRST TAIN1
CAIN IOREG,177
JRST TAIN2
CAIN IOREG,"N"
JRST TAIN3
CAIN IOREG,"Y"
JRST TAIN4
CAIN IOREG,12
JRST TAIN5
CAIN IOREG,33
JRST TAIN5
CAIN IOREG,37
JRST TAIN5
CAIN IOREG," "
JRST TAIN5
MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST TAIN1
TAIN2: TSOUT <[ASCIZ /XXX/],CRLF>
RETURN
TAIN3: TSOUT <[ASCIZ /No/],CRLF>
RETURN SKIP,1
TAIN4: TSOUT <[ASCIZ /Yes/]>
TAIN5: TSOUT <CRLF>
ENDR SKIP,2
; TERMINAL COMMAND INPUT ROUTINE
;
; WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
; INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
; IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
; LINE FEED, EOL, OR SPACE WILL FINISH IT.
; IF NOT, SUCH CHARACTERS WILL BE REJECTED.
; ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
; ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
; IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
; POINTER TO COMMAND STRING LIST
; NUMBER OF COMMANDS
; NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
; NUMBER OF WORDS IN LARGEST COMMAND STRING
; <VALUE LIST>
; <COMMAND STRING LIST>
; OUT: TCIO -- LAST CHAR INPUT
; FLAG -- COMMAND VALUE
; RETURNS: SKIP,0 -- DELETE LINE
; SKIP,1 -- NULL COMMAND
; SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$: BEGINR <TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
MOVE TCIACB,TCIO
SETZ UTIL,
TCII01: MOVEM UTIL,TCIPCL(UTIL)
ADDI UTIL,1
CAME UTIL,1(TCIACB)
JRST TCII01
ADDI UTIL,TCIPCL
MOVEM UTIL,TCIPNF
HRRI UTIL,TCIPCL
HRL UTIL,1(TCIACB)
MOVEM UTIL,TCIPLP
MOVE TCIBP,[440700,,ABUF]
HRLI TCISBP,350700
HRR TCISBP,(TCIACB)
SETZ TCISCC,
TCICHR: TBIN <TCIO>
CAIN TCIO,"R"-100
JRST TCIREP
CAIN TCIO,"?"
JRST TCIQUA
CAIN TCIO,"A"-100
JRST TCIDEL
CAIN TCIO,"X"-100
JRST TCIENR
CAIN TCIO,177
JRST TCIENR
CAIN TCIO,15
JRST TCICHR
CAIN TCIO,12
JRST TCIC01
CAIN TCIO,37
JRST TCIC01
CAIN TCIO," "
JRST TCIC01
CAIN TCIO,33
JRST TCIC01
CAIG TCIO," "
JRST TCIBAD
JRST TCIC02
TCIC01: JUMPE TCISCC,TCIENN
HLRZ UTIL,TCIPLP(TCISCC)
CAIN UTIL,1 ; OK IF JUST ONE POSSIBILITY
JRST TCIEND
TCIC02: SETZ TCIPCC,
MOVE TCIPBP,TCISBP
MOVE UTIL,TCIPNF
MOVEM UTIL,<TCIPLP+1>(TCISCC)
SETZ TCIMAC,
HRRZI TCIMAN,-1
TCIC03: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC04
CAIE UTIL,(TCIO)
JRST TCIC08
TCIC04: HLRZ TCITCC,TCIPLP(TCISCC)
HRRZ TCITLP,TCIPLP(TCISCC)
TCIC05: MOVE UTIL,(TCITLP)
CAIN UTIL,(TCIPCC)
JRST TCIC06
AOJ TCITLP,
SOJG TCITCC,TCIC05
JRST TCIC08
TCIC06: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC07
AOJ TCIMAC,
MOVEM TCIPCC,@TCIPNF
AOS TCIPNF
JRST TCIC08
TCIC07: CAIN TCIMAN,-1
SETO TCIMAN,
CAIE TCIMAN,-1
HRRZI TCIMAN,(TCIPCC)
TCIC08: ADD TCIPBP,3(TCIACB)
AOJ TCIPCC,
CAME TCIPCC,1(TCIACB)
JRST TCIC03
CAIN TCIO,12
JRST TCIC09
CAIN TCIO,37
JRST TCIC09
CAIN TCIO," "
JRST TCIC09
CAIE TCIO,33
JRST TCIC10
TCIC09: JUMPL TCIMAN,TCIBAD
CAIN TCIMAN,-1
JRST TCIBAD
JRST TCIEND
TCIC10: JUMPE TCIMAC,TCIBAD
AOJ TCISCC,
HRLM TCIMAC,TCIPLP(TCISCC)
IBP TCISBP
IDPB TCIO,TCIBP
TBOUT <TCIO> ; ECHO
JRST TCICHR
TCIBAD: MOVEI TCIO,"G"-100
TBOUT <TCIO>
JRST TCICHR
TCIREP: TSOUT <CRLF>
HLRZ UTIL,TCIACB
TSOUT <(UTIL)>
HRRZI TCIPCC,(TCISCC) ; OUTPUT LOOP CONTROL = CHARS SO FAR
MOVE TCIPBP,[440700,,ABUF]
TCIR01: SOJL TCIPCC,TCICHR
ILDB TCIO,TCIPBP
TBOUT <TCIO>
JRST TCIR01
TCIQUA: TBOUT <TCIO> ; PRINT "?"
HLRZ TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
HRRZ TCIPBP,TCIPLP(TCISCC)
TCIQ01: TSOUT <CRLF>
MOVEI TCIO,11
TBOUT <TCIO>
MOVE TCITCC,2(TCIACB)
MOVE TCITLP,(TCIPBP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,440700
TCIQ02: ILDB TCIO,TCITLP
JUMPE TCIO,TCIQ03
TBOUT <TCIO>
SOJG TCITCC,TCIQ02
TCIQ03: AOJ TCIPBP,
SOJG TCIPCC,TCIQ01
JRST TCIREP
TCIDEL: JUMPLE TCISCC,TCIBAD ; THERE'S NO CHARACTER TO DELETE
MOVEI TCIO,"\"
TBOUT <TCIO>
LDB TCIO,TCIBP
TBOUT <TCIO>
SOJ TCIBP, ; FIX LINE BYTE PTR
IBP TCIBP
IBP TCIBP
IBP TCIBP
IBP TCIBP
HRRZ UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
MOVEM UTIL,TCIPNF
SOJ TCISBP, ; FIX SCAN BYTE PTR
IBP TCISBP
IBP TCISBP
IBP TCISBP
IBP TCISBP
SOJA TCISCC,TCICHR
TCIENR: TSOUT <[ASCIZ /XXX/],CRLF>
SETZ FLAG,
RETURN
TCIENN: SETZ FLAG,
RETURN SKIP,1
TCIEND: MOVE TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
MOVE TCITLP,(TCITLP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,440700
SETZ TCITCC,
TCIE01: IBP TCITLP
AOJ TCITCC,
CAIE TCITCC,(TCISCC)
JRST TCIE01
TCIE02: AOJ TCITCC,
CAMLE TCITCC,2(TCIACB)
JRST TCIE03
ILDB TCIMAC,TCITLP
JUMPE TCIMAC,TCIE03
TBOUT <TCIMAC>
JRST TCIE02
TCIE03: MOVE TCITLP,TCIPLP(TCISCC)
MOVE FLAG,(TCITLP)
ADDI FLAG,4(TCIACB)
MOVE FLAG,(FLAG)
ENDR SKIP,2
; TERMINAL STRING INPUT
; IN: IOREG -- POINTER TO BUFFER,,SIZE OF BUFFER
; UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
; OUT: IOREG -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
; UTIL -- COUNT OF CHARACTERS
;
$TSIN$: BEGINR <BPREG,R10,R11,R12>
MOVE R10,IOREG
MOVE R11,UTIL
HLR BPREG,IOREG
HRLI BPREG,440700
SETZ UTIL,
TSICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST TSIREP
CAIN IOREG,"A"-100
JRST TSIDEL
CAIN IOREG,"X"-100
JRST TSIENR
CAIN IOREG,177
JRST TSIENR
CAIN IOREG,15
JRST TSICHR
CAIN IOREG,12
JRST TSIEND
CAIN IOREG,33
JRST TSIEND
CAIN IOREG,37
JRST TSIEND
CAIGE IOREG," "
JRST TSIBAD
CAIL UTIL,(R10)
JRST TSIBAD
IDPB IOREG,BPREG
ADDI UTIL,1
JUMPL R11,TSICHR
TBOUT <IOREG>
JRST TSICHR
TSIBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST TSICHR
TSIREP: TSOUT <CRLF>
TSOUT <(R11)>
JUMPL R11,TSICHR
HRRZI IOREG,(BPREG)
HLR R12,R10
CAIGE IOREG,(R12)
JRST TSICHR
HRLI R12,440700
TSIR01: CAMN R12,BPREG
JRST TSICHR
ILDB IOREG,R12
TBOUT <IOREG>
JRST TSIR01
TSIDEL: JUMPE UTIL,TSIBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
SUBI UTIL,1
JUMPL R11,TSICHR
TBOUT <IOREG>
JRST TSICHR
TSIENR: TSOUT <[ASCIZ /XXX/],CRLF>
SETO IOREG,
SETZ UTIL,
RETURN
TSIEND: SETZ R12,
IDPB R12,BPREG
ENDR SKIP,1
; TERMINAL NUMBER INPUT
; IN: IOREG -- POINTER TO ↑R TEXT,,RADIX
; OUT: IOREG -- NUMBER
;
$TNIN$: BEGINR <BPREG,UTIL,FLAG>
MOVE UTIL,IOREG
MOVE BPREG,[440700,,UBUF1]
SETZ FLAG,
TNICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST TNIREP
CAIN IOREG,"A"-100
JRST TNIDEL
CAIN IOREG,"X"-100
JRST TNIENR
CAIN IOREG,177
JRST TNIENR
CAIN IOREG,15
JRST TNICHR
CAIN IOREG,12
JRST TNIEND
CAIN IOREG,33
JRST TNIEND
CAIN IOREG,37
JRST TNIEND
CAIN IOREG," "
JRST TNIEND
CAIGE IOREG,"0"
JRST TNIBAD
CAIL IOREG,"0"(UTIL)
JRST TNIBAD
CAILE FLAG,12 ; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
JRST TNIBAD
IDPB IOREG,BPREG
TBOUT <IOREG>
AOJA FLAG,TNICHR
TNIBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST TNICHR
TNIREP: TSOUT <CRLF>
HLRZ IOREG,UTIL
TSOUT <(IOREG)>
HRRZI IOREG,(BPREG)
CAIGE IOREG,UBUF1
JRST TNICHR
MOVE IOREG,[440700,,UBUF1]
TNIR01: CAMN IOREG,BPREG
JRST TNICHR
ILDB REG1,IOREG
TBOUT <REG1>
JRST TNIR01
TNIDEL: JUMPE FLAG,TNIBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
TBOUT <IOREG>
SOJA FLAG,TNICHR
TNIENR: TSOUT <[ASCIZ /XXX/],CRLF>
SETZ IOREG,
RETURN
TNIEND: SETZ IOREG,
IDPB IOREG,BPREG
MOVE BPREG,[440700,,UBUF1]
MOVEI FLAG,(UTIL)
TNICAL: ILDB UTIL,BPREG
JUMPE UTIL,RETN(1)
IMULI IOREG,(FLAG)
SUBI UTIL,"0"
ADDI IOREG,(UTIL)
JRST TNICAL
ENDR
; DCNIN -- DATACOMPUTER NUMBER INPUT
; OUT: IOREG -- 36-BIT MAGNITUDE INTEGER
;
DCNIN: BEGINR <<IOREG+1>,UTIL>
SETZ IOREG,
DCNIN1: DCBIN <UTIL>
CAIGE UTIL,"0"
RETURN
CAILE UTIL,"9"
RETURN
JUMPL IOREG,DCNIN2
MULI IOREG,↑D10
CAILE IOREG,1
JRST DCNIN2
CAIN IOREG,1
TLO <IOREG+1>,400000
MOVE IOREG,<IOREG+1>
ADDI IOREG,-"0"(UTIL)
JRST DCNIN1
DCNIN2: SETO IOREG,
JRST DCNIN1
ENDR
; $NOUT$ -- INTEGER OUTPUT
; IN: REG1 -- INTEGER
; REG2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$: BEGINR <FLAG>
MOVE FLAG,REG2
MOVE REG3,[440700,,UBUF1]
MOVEI REG4,1
JUMPGE REG1,NOUT1
LSHC REG1,-↑D35
LSH REG2,-1
DIVI REG1,(FLAG)
JRST .+2
NOUT1: IDIVI REG1,(FLAG)
ADDI REG2,60
IDPB REG2,REG3
SKIPE REG1
AOJA REG4,NOUT1
MOVE REG1,[440700,,UBUF2]
NOUT2: LDB REG2,REG3
IDPB REG2,REG1
SOJ REG3,
IBP REG3
IBP REG3
IBP REG3
IBP REG3
SOJG REG4,NOUT2
IDPB REG4,REG1
SKIPL FLAG
JRST NOUT3
DCSOUT <UBUF2>
RETURN
NOUT3: TSOUT <UBUF2>
ENDR
; ***SYSTEM DEPENDENT ROUTINES***
; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE 0,[SIXBIT/DFTP/]
SETNAM 0,
OPEN 0,[ 200 ; TURN OFF TTY ECHOING
SIXBIT /TTY/
0]
THUD
CALLR ICP
ENDR
; TOPS-10 ICP: 1) SET CONNECTION SOCKETS IN LISTENING STATE
; 2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 3) OPEN CONNECTION SOCKETS
; A) EVEN - RECEIVE
; B) ODD - SEND
;
ICP: BEGINR <IOREG,UTIL,FLAG>
ICPBEG: SETZM ICPBLK+.IBDEV
SETZM DCIBLK+.IBDEV
SETZM DCOBLK+.IBDEV
SETZM DCIBLK+.IBRMT
SETZM DCOBLK+.IBRMT
MOVE IOREG,LINP ; LISTEN ON INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST .+2
JRST ICPICP
MOVE IOREG,DCIBLK+.IBERR
CAIE IOREG,.IESKT
JRST ICPEIL
MOVE IOREG,PWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
LDB REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,102
SETZ REG3,
SETZ FLAG,
ICPRDV: MOVE IOREG,[SIXBIT/IMP/] ; RESET DEVICE(S) USED
MOVEM IOREG,WRKBLK+.IBDEV
MOVEI REG1,(REG3)
IDIVI REG1,10
JUMPE REG1,ICPRD1
ADDI REG1,20
ADDI REG2,20
DPB REG1,[140600,,WRKBLK+.IBDEV]
DPB REG2,[060600,,WRKBLK+.IBDEV]
JRST ICPRD2
ICPRD1: ADDI REG2,20
DPB REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2: SETZM WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/] ; TEST STATUS OF SOCKET
JRST ICPRD3
HRRZ IOREG,WRKBLK+.IBHST ; FOREIGN HOST
CAIE IOREG,DCHOST
JRST ICPRD3
PJOB REG1,
HLRZ REG2,WRKBLK+.IBSTT ; OWNING JOB
CAIE REG2,(REG1)
JRST ICPRD3
MOVE IOREG,WRKBLK+.IBLCL
CAMN IOREG,UTIL ; DATALANGUAGE SOCKET(S)
JRST ICPCLS
SUBI IOREG,2
CAMN IOREG,UTIL ; INPUT DATA SOCKET
JRST ICPCLI
ICPRD3: MOVEI IOREG,1 ; OUTPUT DATA SOCKET
MOVEM IOREG,WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
HRRZ IOREG,WRKBLK+.IBHST
CAIE IOREG,DCHOST
JRST ICPRD4
PJOB REG1,
HLRZ REG2,WRKBLK+.IBSTT
CAIE REG2,(REG1)
JRST ICPRD4
MOVE IOREG,WRKBLK+.IBLCL
SUBI IOREG,3
CAMN IOREG,UTIL
JRST ICPCLO
ICPRD4: ADDI REG3,1
CAIGE REG3,(REG4)
JRST ICPRDV
JUMPN FLAG,ICPBEG
TTCALL 3,[ASCIZ / (Connections in use.)/]
EXIT
ICPCLS: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVEI IOREG,1
MOVEM IOREG,WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / [Restarting]
/]
SETO FLAG,
JRST ICPRDV
ICPCLI: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / (Retrieve interrupted: connection closed.)
/]
JRST ICPRDV
ICPCLO: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / (Store interrupted: connection closed.)
/]
JRST ICPRDV
ICPICP: MOVE IOREG,DCIBLK+.IBDEV ; GET DEVICE NAME
MOVEM IOREG,DCOBLK+.IBDEV ; AND COPY IT FOR DUPLEX
MOVEM IOREG,DCCHAS+1
MOVE IOREG,LOUT ; LISTEN ON OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPEOL
MOVE IOREG,OICP
CALL IOREG,[SIXBIT/IMPUUO/] ; OPEN CONNECTION
JRST ICPEC
MOVE IOREG,ICPBLK+.IBDEV ; GET DEVICE NAME
MOVEM IOREG,ICCHAS+1
OPEN DCCHAN,ICCHAS ; OPEN AS STANDARD DEVICE
JRST ICPEF
IN DCCHAN,
JRST .+2
JRST ICPET
MOVE IOREG,ICPBUF+1
MOVE IOREG,1(IOREG) ; GET THE SOCKET NUMBER
LSH IOREG,-4 ; RIGHT JUSTIFY 32 BITS
MOVEM IOREG,DCOBLK+.IBRMT
AOJ IOREG,
MOVEM IOREG,DCIBLK+.IBRMT
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
MOVE IOREG,OINP ; OPEN INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEIC
MOVE IOREG,OOUT ; OPEN OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEOC
OPEN DCCHAN,DCCHAS
JRST NETECF
OUT DCCHAN,
JRST .+2
JRST NETEOT
MOVE IOREG,PWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST QUIT
HRRZ IOREG,WRKBLK+.IBHST
MOVEM IOREG,LHOST
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: MOVEI IOREG,"Z"-100
IDPB IOREG,DCOBUF+1
OUT DCCHAN,
JRST .+1
QUIT01: INPUT DCCHAN,
STATZ DCCHAN,20000
JRST QUIT02
SKIPN FLAGDD
JRST QUIT01
HRRZ REG1,DCIBUF
CALLR NUTDD
JRST QUIT01
QUIT02: RELEAS DCCHAN, ; RELEASE INPUT/OUTPUT DEVICE
QUIT03: MOVE IOREG,COUT ; CLOSE OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEOC
QUIT04: MOVE IOREG,CINP ; CLOSE INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEIC
RESET
EXIT
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
SETZM DCDBLK+.IBDEV
MOVEI REG1,104
MOVEM REG1,DCDBLK+.IBLCL
MOVE REG1,DCIBLK+.IBRMT
ADDI REG1,2
MOVEM REG1,DCDBLK+.IBRMT
MOVE REG1,ODAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOI2
MOVE REG1,DCDBLK+.IBDEV
MOVEM REG1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOI1
RETURN SKIP,1
NETOI1: MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOI2
NETOI2: TTCALL 3,[ASCIZ / ?? NETWORK CONNECTION OPEN FAILURE ??
/]
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
SETZM DCDBLK+.IBDEV
MOVEI REG1,105
MOVEM REG1,DCDBLK+.IBLCL
MOVE REG1,DCOBLK+.IBRMT
ADDI REG1,2
MOVEM REG1,DCDBLK+.IBRMT
MOVE REG1,ODAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOO2
MOVE REG1,DCDBLK+.IBDEV
MOVEM REG1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOO1
RETURN SKIP,1
NETOO1: MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOO2
NETOO2: TTCALL 3,[ASCIZ / ?? NETWORK CONNECTION OPEN FAILURE ??
/]
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
RELEAS DDCHAN,
MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETC1
RETURN
NETC1: TTCALL 3,[ASCIZ / ?? NETWORK CONNECTION CLOSE FAILURE ??
/]
ENDR
; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
; OUT: UTIL
;
NETNI: BEGINR
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,104
ENDR
; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
; OUT: UTIL
;
NETNO: BEGINR
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,105
ENDR
; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI: BEGINR
IN DCCHAN,
JRST .+2
JRST NETEIT
SKIPN FLAGDD
RETURN
HRRZ REG1,DCIBUF
CALLR NUTDD
ENDR
; NETWORK UTILITY -- MESSAGE OUTPUT
; IN: REG1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO: BEGINR <IOREG,BPREG>
MOVEI BPREG,(REG1)
HRLI BPREG,440700
NUTMOL: ILDB IOREG,BPREG
JUMPE IOREG,RETN(0)
SKIPE DCOBUF+2
JRST NUTMOB
SKIPN FLAGDD
JRST NUTMOO
HRRZ REG1,DCOBUF
CALLR NUTDD
NUTMOO: OUT DCCHAN,
JRST .+2
JRST NETEOT
NUTMOB: SOS DCOBUF+2
IDPB IOREG,DCOBUF+1
JRST NUTMOL
ENDR
; NETWORK UTILITY -- DISPLAY DATALANGUAGE
; IN: REG1 -- POINTER TO BUFFER HEADER
;
NUTDD: BEGINR <IOREG,UTIL>
HLRZ UTIL,(REG1)
ADDI REG1,2
HRLI REG1,440700
TRZ UTIL,400000
SUBI UTIL,1
IMULI UTIL,5
NUTDDL: SOJL UTIL,RETN(0)
ILDB IOREG,REG1
JUMPE IOREG,RETN(0)
TTCALL 1,IOREG
JRST NUTDDL
ENDR
; FATAL NETWORK ERROR MESSAGES
;
ICPERD: TTCALL 3,[ASCIZ / ?? RESTART FAILURE ??/]
EXIT
ICPEIL: TTCALL 3,[ASCIZ / ?? INPUT SOCKET LISTEN FAILURE ??/]
EXIT
ICPEOL: TTCALL 3,[ASCIZ / ?? OUTPUT SOCKET LISTEN FAILURE ??/]
JRST QUIT04
ICPET: TTCALL 3,[ASCIZ / ?? ICP FAILURE (TRANSFER) ??/]
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
ICPEZ: MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
JRST QUIT03
ICPEF: TTCALL 3,[ASCIZ / ?? ICP FAILURE (FILE CONTROL) ??/]
JRST ICPEZ
ICPEC: TTCALL 3,[ASCIZ / The datacomputer is unavailable/]
MOVE 0,ICPBLK+.IBERR
CAIN 0,.IESOF ; SOCKET OPEN FAILURE
TTCALL 3,[ASCIZ / (rejecting)/]
CAIN 0,.IEDWN
TTCALL 3,[ASCIZ / (down)/]
CAIN 0,.IETIM
TTCALL 3,[ASCIZ / (timeout)/]
TTCALL 3,[ASCIZ /.
/]
MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/]
JRST QUIT03
JRST QUIT03
NETEIC: TTCALL 3,[ASCIZ / ?? INPUT FAILURE (CONNECTION) ??/]
EXIT
NETEOC: TTCALL 3,[ASCIZ / ?? OUTPUT FAILURE (CONNECTION) ??/]
JRST QUIT04
NETECF: TTCALL 3,[ASCIZ / ?? FILE CONTROL FAILURE ??/]
JRST QUIT03
NETEIT: TTCALL 3,[ASCIZ / ?? INPUT FAILURE (TRANSFER) ??/]
JRST QUIT
NETEOT: TTCALL 3,[ASCIZ / ?? OUTPUT FAILURE (TRANSFER) ??/]
JRST QUIT
OICP: .IUCON,,ICPBLK
CICP: .IUCLS,,ICPBLK
LINP: .IULSN,,DCIBLK
OINP: .IUCON,,DCIBLK
CINP: .IUCLS,,DCIBLK
LOUT: .IULSN,,DCOBLK
OOUT: .IUCON,,DCOBLK
COUT: .IUCLS,,DCOBLK
ODAT: 001000+.IUCON,,DCDBLK ; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT: .IUCLS,,DCDBLK
PWRK: .IULHS,,WRKBLK
SWRK: .IUSTT,,WRKBLK
CWRK: .IUCLS,,WRKBLK
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOI1
LOOKUP LFCHAN,LFILE ; PREPARE FILE FOR INPUT
JRST LOCOI2
RETURN SKIP,1
LOCOI1: TTCALL 3,[ASCIZ / ?? LOCAL CHANNEL OPEN FAILURE ??
/]
RELEAS LFCHAN,
RETURN
LOCOI2: TTCALL 3,[ASCIZ / (Local file not found.)
/]
RELEAS LFCHAN,
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR <IOREG,<IOREG+1>>
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS
JRST LOCOO2
MOVE IOREG,<LFILE+1>
MOVE <IOREG+1>,<LFILE+2>
LOOKUP LFCHAN,LFILE
JRST LOCOO1
TAIN <[ASCIZ / [Old Local File][Confirm]/]>
JRST .+3
JRST .+2
JRST LOCOO1
RELEAS LFCHAN,
RETURN
LOCOO1: RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOO2
MOVEM IOREG,<LFILE+1>
MOVEM <IOREG+1>,<LFILE+2>
ENTER LFCHAN,LFILE ; PREPARE FILE FOR OUTPUT
JRST LOCOO2
RETURN SKIP,1
LOCOO2: TTCALL 3,[ASCIZ / ?? LOCAL FILE CREATION FAILURE ??
/]
RELEAS LFCHAN,
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
RELEAS LFCHAN,
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: UTIL -- SIZE IN WORDS
;
LOCS: BEGINR
SKIPL LFILE+3
JRST LOCS1
HLRO UTIL,LFILE+3 ; SIZE IN WORDS
MOVN UTIL,UTIL
RETURN
LOCS1: HLRZ UTIL,LFILE+3 ; SIZE IN BLOCKS
IMULI UTIL,SIZBLK
ENDR
; LOCDG -- LOCAL FILE CREATION DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG: BEGINR <BPREG,UTIL>
MOVE BPREG,[440700,,GBUF1]
ILDB UTIL,BPREG
JUMPE UTIL,RETN(0)
CAIN UTIL," "
MOVEI UTIL,"0"
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
MOVE REG2,[440700,,REG3]
SETZ REG3,
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
MOVEI REG2,↑D11
CAMN REG3,LOCDM(REG2)
JRST .+3
SOJGE REG2,.-2
RETURN
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
ILDB UTIL,BPREG
MOVEI REG3,-"0"(UTIL)
IMULI REG3,↑D10
ILDB UTIL,BPREG
ADDI REG3,-"0"(UTIL)
SUBI REG3,↑D64
IMULI REG3,↑D12
ADDI REG3,(REG2)
IMULI REG3,↑D31
ADDI REG3,-1(REG1)
ILDB UTIL,BPREG
CAIE UTIL," "
RETURN
ILDB UTIL,BPREG
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,6
ILDB UTIL,BPREG
CAIE UTIL,":"
RETURN
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
DPB REG3,[001400,,LFILE+2]
LSH REG3,-14
DPB REG3,[170300,,LFILE+1]
DPB REG1,[141300,,LFILE+2]
ENDR
; LOCDP -- LOCAL FILE CREATION DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP: BEGINR
MOVE REG1,[440700,,GBUF1]
LDB REG2,[001400,,LFILE+2] ; CREATION DATE
LDB REG3,[170300,,LFILE+1]
LSH REG3,14
IORI REG2,(REG3)
IDIVI REG2,↑D31
MOVEI REG4,(REG2)
MOVEI REG2,1(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
CAIN REG2,"0"
MOVEI REG2," "
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,"-"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D12
MOVEI REG4,(REG2)
HRRI REG2,LOCDM(REG3)
HRLI REG2,440700
SCOPY (REG2,REG1)
MOVEI REG2,"-"
IDPB REG2,REG1
MOVEI REG2,↑D64(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2," "
IDPB REG2,REG1
LDB REG2,[141300,,LFILE+2] ; CREATION TIME
IDIVI REG2,↑D60
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,":"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
SETZ REG2,
IDPB REG2,REG1
ENDR
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LOCDM: ASCII /JAN/
ASCII /FEB/
ASCII /MAR/
ASCII /APR/
ASCII /MAY/
ASCII /JUN/
ASCII /JUL/
ASCII /AUG/
ASCII /SEP/
ASCII /OCT/
ASCII /NOV/
ASCII /DEC/
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IOREG,BPREG,UTIL>
HRRI BPREG,(IOREG)
HRLI BPREG,440700
SETZM LFILE ; CLEAR OLD FILE NAME
SETZM LFILE+1 ; AND EXTENSION
SETZM LFILE+2
SETZM LFILE+3
MOVEI REG1,LUTFNT ; INITIALIZE XCT PNTR
MOVEI REG2,LFILE ; SET DESTINATION OF IOR
SETZ UTIL,
LUTFN1: ILDB IOREG,BPREG
JUMPE IOREG,RETN(0)
CAIN IOREG,"." ; PREPARE FOR FILE EXTENSION IF "."
JRST LUTFN2
CAILE UTIL,5
JRST LUTFN1
ADDI IOREG,40 ; CONVERT TO SIXBIT BY ADDITION
ANDI IOREG,77 ; AND REMOVAL OF HIGH BITS
XCT (REG1) ; EXECUTE THE PROPER ROTATE
IORM IOREG,(REG2) ; IOR RESULT INTO FILE OR FILE+1
AOJ REG1, ; INCREMENT THE XCT PNTR
AOJA UTIL,LUTFN1
LUTFN2: CAIN REG2,LFILE+1
JRST RETN(0) ; IGNORE MULTIPLE EXTENSIONS
MOVEI REG1,LUTFNT ; RESET PNTRS FOR EXTENSION
MOVEI REG2,LFILE+1
MOVEI UTIL,3
JRST LUTFN1
LUTFNT: ROT IOREG,-6 ; HIGH ORDER
ROT IOREG,-14
ROT IOREG,22
ROT IOREG,14
ROT IOREG,6
ROT IOREG,0 ; LOW ORDER
ENDR
; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS: BEGINR
SKIPN LUTDSP
JRST LUTDSS
MOVE REG1,LUTDSP
SKIPN (REG1)
JRST LUTDSI
LUTDS1: MOVNI REG2,2
ADDM REG2,LDIBUF+2
SKIPGE LDIBUF+2
JRST LUTDSI
MOVE REG3,[440700,,ABUF]
HRLI REG1,440600
MOVEI REG2,6
LUTDS2: ILDB REG4,REG1
JUMPE REG4,LUTDS3
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,LUTDS2
LUTDS3: ADDI REG1,1
LDB REG4,[222200,,(REG1)]
JUMPE REG4,LUTDS5
MOVEI REG4,"."
IDPB REG4,REG3
HRLI REG1,440600
MOVEI REG2,3
LUTDS4: ILDB REG4,REG1
JUMPE REG4,LUTDS5
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,LUTDS4
LUTDS5: SETZ REG4,
IDPB REG4,REG3
ADDI REG1,1
HRRZM REG1,LUTDSP
RETURN SKIP,1
LUTDSS: RELEAS LDCHAN,
GETPPN REG1,
MOVEM REG1,LDIR
MOVE REG1,[SIXBIT/UFD/]
MOVEM REG1,LDIR+1
SETZM LDIR+2
MOVE REG1,[1,,1]
MOVEM REG1,LDIR+3
OPEN LDCHAN,LDCHAS
JRST LUTDSE
LOOKUP LDCHAN,LDIR
JRST LUTDSE
IN LDCHAN,
JRST .+2
JRST LUTDSE
HRRZ REG1,LDIBUF
ADDI REG1,2
SKIPE (REG1)
JRST LUTDS1
TTCALL 3,[ASCIZ / (No local files.)
/]
RELEAS LDCHAN,
RETURN
LUTDSI: IN LDCHAN,
JRST .+2
JRST LUTDSD
HRRZ REG1,LDIBUF
ADDI REG1,2
SKIPE (REG1)
JRST LUTDS1
RELEAS LDCHAN,
RETURN
LUTDSD: STATO LDCHAN,20000
LUTDSE: TTCALL 3,[ASCIZ / ?? LOCAL DIRECTORY FAILURE ??
/]
RELEAS LDCHAN,
ENDR
; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN: BEGINR <UTIL>
OUT DDCHAN,
JRST .+2
THUD
SETZM MOVSUM
CALLR LOCS
MOVEM UTIL,MOVSPA
MSTIME REG1,
IDIVI REG1,↑D1000
MOVEM REG1,MOVTIM
MOVLN1: IN LFCHAN,
JRST .+2
JRST MOVLN2
HRR REG1,LFIBUF
HRLI REG1,2(REG1)
HRR REG2,DDOBUF
HRRI REG1,2(REG2)
BLT REG1,<2+200-1>(REG2)
MOVE REG1,LFIBUF+2
ADDM REG1,DDOBUF+1
OUT DDCHAN,
JRST .+2
THUD
HRRZ REG2,LFIBUF
ADDI REG1,1(REG2)
ADDI REG2,2
SETZ REG3,
ADD REG3,(REG2)
CAIGE REG2,(REG1)
AOJA REG2,.-2
ADDM REG3,MOVSUM
JRST MOVLN1
MOVLN2: STATO LFCHAN,20000
THUD
MSTIME REG1,
IDIVI REG1,↑D1000
MOVE REG2,MOVTIM
CAMGE REG1,REG2
ADDI REG1,<↑D24*↑D60*↑D60>
SUB REG1,REG2
MOVEM REG1,MOVTIM
ENDR
; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL: BEGINR
OUT LFCHAN,
JRST .+2
THUD
SETZM LFOBUF+2 ; COUNT: # WORDS USED (REVERSE TOPS-10)
SETZM MOVSUM
SETZM MOVSPA
MSTIME REG1,
IDIVI REG1,↑D1000
MOVEM REG1,MOVTIM
MOVNL1: IN DDCHAN,
JRST .+2
JRST MOVNL4
MOVE REG1,DDIBUF+2
ADD REG1,LFOBUF+2
CAIL REG1,200
JRST MOVNL2
HRR REG2,DDIBUF
HRLI REG2,2(REG2)
HRR REG2,LFOBUF+1
AOJ REG2,
HRRZ REG1,LFOBUF+1
ADD REG1,DDIBUF+2
BLT REG2,(REG1)
MOVE REG1,DDIBUF+2
ADDM REG1,LFOBUF+1
ADDM REG1,LFOBUF+2
JRST MOVNL3
MOVNL2: HRRZI REG3,-200(REG1)
MOVEI REG4,200
SUB REG4,LFOBUF+2
HRR REG2,DDIBUF
HRLI REG2,2(REG2)
HRR REG2,LFOBUF+1
AOJ REG2,
MOVE REG1,LFOBUF
ADDI REG1,<2+200-1>
BLT REG2,(REG1)
HRRM REG1,LFOBUF+1
OUT LFCHAN,
JRST .+2
THUD
SETZM LFOBUF+2
JUMPE REG3,MOVNL3
MOVEM REG3,LFOBUF+2
ADDM REG3,LFOBUF+1
HRRZI REG2,(REG4)
ADD REG2,DDIBUF
HRLI REG2,2(REG2)
HRR REG2,LFOBUF
ADDI REG2,2
BLT REG2,@LFOBUF+1
MOVNL3: MOVE REG1,DDIBUF+2
ADDM REG1,MOVSPA
HRRZ REG2,DDIBUF
ADDI REG1,1(REG2)
ADDI REG2,2
SETZ REG3,
ADD REG3,(REG2)
CAIGE REG2,(REG1)
AOJA REG2,.-2
ADDM REG3,MOVSUM
JRST MOVNL1
MOVNL4: STATO DDCHAN,20000
THUD
SKIPN LFOBUF+2
JRST MOVNL5
OUT LFCHAN,
JRST MOVNL5
THUD
MOVNL5: MSTIME REG1,
IDIVI REG1,↑D1000
MOVE REG2,MOVTIM
CAMGE REG1,REG2
ADDI REG1,<↑D24*↑D60*↑D60>
SUB REG1,REG2
MOVEM REG1,MOVTIM
ENDR
; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV: BEGINR <IOREG,UTIL,FLAG>
SETZ UTIL,
SETZ FLAG,
SETZM MOVSUM
IN DDCHAN,
JRST .+2
THUD
IN LFCHAN,
JRST .+2
JRST MOVV4
MOVV1: CAIN FLAG,0
ADDI UTIL,1
SKIPLE LFIBUF+2
JRST .+4
IN LFCHAN,
JRST .+2
JRST MOVV2
SOS LFIBUF+2
AOS LFIBUF+1
MOVE IOREG,@<LFIBUF+1>
SKIPLE DDIBUF+2
JRST .+4
IN DDCHAN,
JRST .+2
JRST MOVV5
SOS DDIBUF+2
AOS DDIBUF+1
MOVE REG1,@<DDIBUF+1>
ADDM REG1,MOVSUM
CAMN IOREG,REG1
JRST MOVV1
AOJA FLAG,MOVV1
MOVV2: STATO LFCHAN,20000
THUD
SKIPLE DDIBUF+2
JRST MOVV4
IN DDCHAN,
JRST MOVV4
STATO DDCHAN,20000
THUD
JUMPN FLAG,MOVV3
TTCALL 3,[ASCIZ / [OK]
/]
RETURN
MOVV3: CAIE FLAG,1
JRST .+3
TTCALL 3,[ASCIZ / (There is one different word at /]
JRST MOVV03
TTCALL 3,[ASCIZ / (There are /]
TNOUT <FLAG>
TTCALL 3,[ASCIZ / different words, with the first difference at /]
MOVV03: TNOUT <UTIL>
TTCALL 3,[ASCIZ /.)
/]
RETURN
MOVV4: SKIPLE DDIBUF+2
JRST .+4
IN DDCHAN,
JRST .+2
JRST MOVV04
SOS DDIBUF+2
AOS DDIBUF+1
MOVE REG1,@<DDIBUF+1>
ADDM REG1,MOVSUM
JRST MOVV4
MOVV04: STATO DDCHAN,20000
THUD
TTCALL 3,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
RETURN
MOVV5: STATO DDCHAN,20000
THUD
TTCALL 3,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
ENDR
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE REG1,[SIXBIT/DFTP/]
SETNM
HRRZI REG1,-1
RFMOD
TRZ REG2,006000 ; (1B24+1B25)
SFMOD
MOVE REG2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
MOVE REG3,[252525,,253000] ; AND EOL'S (NO NULLS)
SFCOC
MOVEI REG1,400000 ; FOR THIS FORK
MOVE REG2,[LEVTAB,,CHNTAB]
SIR ; SET UP INTERRUPT TABLES
EIR ; ENABLE INTERRUPTS
MOVE REG1,[17,,0] ; ↑O ON CHANNEL 0
ATI
MOVEI REG1,400000 ; FOR THIS FORK
MOVE REG2,[1B0+1B10+1B15] ; TTY, EOF, ILI
AIC ; ACTIVATE CHANNELS
CALLR ICP
ENDR
; TENEX ICP: 1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 2) OPEN CONNECTION SOCKETS
; A) EVEN - INPUT
; B) ODD - OUTPUT
; JFN STRING: "NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:20./]
SETZ REG3,
SOUT ; LOCAL SOCKET 20+JOBREL
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT ; FAILURE -- MAKE HOST # INTO STRING
JRST .+1 ; CVHST SUCCESS OR NOUT FAILURE
MOVN REG2,DCSOCK
NOUT
JRST .+1
HRLZI REG1,1 ; SHORT GTJFN
HRROI REG2,UBUF1
GTJFN ; ICP CONNECTION
JRST ICPEG
MOVE REG2,[40B5+1B19] ; 32-BIT, READ
OPENF ; OPEN ICP CONNECTION
JRST ICPEO
BIN
MOVEM REG2,ICPSOC
CLOSF
JRST ICPEC
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:22./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN ; OUTPUT JFN
JRST ICPEIG
MOVEM REG1,DCOJFN
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN ; INPUT JFN
JRST ICPEOG
MOVEM REG1,DCIJFN
MOVE REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
OPENF
JRST ICPEIO
MOVE REG1,DCOJFN
MOVE REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST ICPEOO
MOVE REG1,[SIXBIT/LHOSTN/]
SYSGT
MOVEM REG1,LHOST
ENDR
; NETWORK QUIT
;
QUIT: MOVE REG1,DCOJFN
MOVEI REG2,"Z"-100
BOUT
MOVEI REG2,21
MTOPR
SETOM FLAGEF
QUIT01: DCBIN <IOREG>
SKIPE FLAGEF
JRST QUIT01
RESET
HALTF
JRST .-1 ; IN CASE OF "CONTINUE"
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:24./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
SUBI REG2,3
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN
JRST NETOI2
MOVEM REG1,DCDJFN
MOVE REG2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
OPENF
JRST NETOI1
RETURN SKIP,1
NETOI1: RLJFN
JRST NETOI2
NETOI2: HRROI REG1,[ASCIZ / ?? NETWORK CONNECTION OPEN FAILURE ??
/]
PSOUT
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:25./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
SUBI REG2,2
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN
JRST NETOO2
MOVEM REG1,DCDJFN
MOVE REG2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST NETOO1
RETURN SKIP,1
NETOO1: RLJFN
JRST NETOO2
NETOO2: HRROI REG1,[ASCIZ / ?? NETWORK CONNECTION OPEN FAILURE ??
/]
PSOUT
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
MOVE REG1,DCDJFN
CLOSF
JRST NETC1
RETURN
NETC1: HRROI [ASCIZ / ?? NETWORK CONNECTION CLOSE FAILURE ??
/]
PSOUT
ENDR
; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
; OUT: UTIL
;
NETNI: BEGINR
GJINF
HRRZI UTIL,(REG2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,24
ENDR
; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
; OUT: UTIL
;
NETNO: BEGINR
GJINF
HRRZI UTIL,(REG2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,25
ENDR
; FATAL NETWORK ERROR MESSAGES
;
NETEQ: PSOUT
RESET
HALTF
JRST .-1
ICPEG: HRROI REG1,[ASCIZ / The datacomputer is unavailable (network)./]
JRST NETEQ
ICPEO: HRROI REG1,[ASCIZ / The datacomputer is unavailable (down)./]
JRST NETEQ
ICPEC: HRROI REG1,[ASCIZ / ?? ICP CLOSF FAILURE ??/]
JRST NETEQ
ICPEOG: HRROI REG1,[ASCIZ / ?? ICP OUTPUT GTJFN FAILURE ??/]
JRST NETEQ
ICPEIG: HRROI REG1,[ASCIZ / ?? ICP INPUT GTJFN FAILURE ??/]
JRST NETEQ
ICPEIO: HRROI REG1,[ASCIZ / ?? ICP OUTPUT OPENF FAILURE ??/]
JRST NETEQ
ICPEOO: HRROI REG1,[ASCIZ / ?? ICP INPUT OPENF FAILURE ??/]
JRST NETEQ
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
HRLZI REG1,100001 ; OLD FILE, SHORT CALL
MOVE REG2,[440700,,LFILE]
GTJFN
JRST LOCOI1
HRRZM REG1,LJFN
MOVE REG2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCOI2
RETURN SKIP,1
LOCOI1: HRROI REG1,[ASCIZ / (Local file not found.)
/]
PSOUT
RETURN
LOCOI2: HRROI REG1,[ASCIZ / (Local file not available.)
/]
PSOUT
MOVE REG1,LJFN
RLJFN
RETURN
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
HRLZI REG1,600001 ; VN, WRITE, SHORT
MOVE REG2,[440700,,LFILE]
GTJFN
JRST LOCOO2
HRRZM REG1,LJFN
MOVE REG2,[440000,,100000] ; 36 BIT BYTE, READ
OPENF
JRST LOCOO1
RETURN SKIP,1
LOCOO1: MOVE REG1,LJFN
RLJFN
JRST .+1
LOCOO2: HRROI REG1,[ASCIZ / ?? LOCAL FILE CREATION FAILURE ??
/]
PSOUT
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
MOVE REG1,LJFN
CLOSF
JRST LOCC1
RETURN
LOCC1: HRROI REG1,[ASCIZ / ?? LOCAL FILE CLOSE FAILURE ??
/]
PSOUT
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: UTIL -- SIZE IN WORDS
;
LOCS: BEGINR
MOVE REG1,LJFN
MOVE REG2,[2,,11] ; READ 2 WORDS, OFFSET OF 11
HRRZI REG3,UBUF1
GTFDB
JRST .+3
SETZ UTIL,
RETURN
LDB REG1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
MOVEI REG2,↑D36
IDIVI REG2,(REG1) ; BYTES/WD
MOVE REG3,UBUF1+1 ; BYTE COUNT TO EOF
ADDI REG3,-1(REG2) ; ACCOUNT FOR TRUNCATION
IDIVI REG3,(REG2) ; NUMBER OF WORDS
MOVE UTIL,REG3
ENDR
; LOCDG -- LOCAL FILE WRITE DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG: BEGINR <IOREG,UTIL>
HRROI REG1,GBUF1
SETZ REG2,
IDTIM
RETURN
MOVE IOREG,REG2
MOVEI REG1,400000 ; FOR THIS FORK
RPCAP
TRNN REG2,600000 ; (1B18+1B19) WHEEL OR OPER
RETURN
MOVE UTIL,REG3
TRO REG3,(REG2)
EPCAP ; ENABLE (!)
HRR REG1,LJFN
HRLI REG1,14 ; OFFSET 14 (LAST WRITE)
SETO REG2,
MOVE REG3,IOREG
CHFDB
JRST .+1
MOVEI REG1,400000
MOVE REG3,UTIL
EPCAP ; RESET CAPABILITIES
ENDR
; LOCDP -- LOCAL FILE WRITE DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP: BEGINR
MOVE REG1,LJFN
MOVE REG2,[1,,14] ; 1 WORD, OFFSET 14 (LAST WRITE)
HRRZI REG3,GBUF1
GTFDB
JRST .+3
SETZM GBUF1
RETURN
HRROI REG1,GBUF1
MOVE REG2,GBUF1
SETZ REG3,
ODTIM
ENDR
; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN: BEGINR <IOREG,UTIL>
SETZM MOVSUM
CALLR LOCS
MOVEM UTIL,MOVSPA
MOVN IOREG,UTIL
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVEM REG3,MOVTIM
MOVLN1: MOVE REG1,LJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SIN
MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SOUT
MOVN UTIL,IOREG
CAILE UTIL,SIZPAG
MOVEI UTIL,SIZPAG
SETZ REG1,
ADD REG1,<PAGE-1>(UTIL)
SOJG UTIL,.-1
ADDM REG1,MOVSUM
ADDI IOREG,SIZPAG
JUMPL IOREG,MOVLN1
MOVE REG1,DCDJFN
MOVEI REG2,21
MTOPR
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVE REG2,MOVTIM
SUB REG3,REG2
MOVEM REG3,MOVTIM
ENDR
; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL: BEGINR <UTIL>
SETOM FLAGEF
SETZM MOVSUM
SETZM MOVSPA
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVEM REG3,MOVTIM
MOVNL1: MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
SIN
MOVE REG1,LJFN
MOVE REG2,[444400,,PAGE]
ADDI REG3,SIZPAG ; WORDS RECEIVED
JUMPE REG3,MOVNL2
MOVEI UTIL,(REG3)
MOVNI REG3,(REG3)
SOUT
ADDM UTIL,MOVSPA
SETZ REG1,
ADD REG1,<PAGE-1>(UTIL)
SOJG UTIL,.-1
ADDM REG1,MOVSUM
MOVNL2: SKIPE FLAGEF
JRST MOVNL1
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVE REG2,MOVTIM
SUB REG3,REG2
MOVEM REG3,MOVTIM
ENDR
; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV: BEGINR <IOREG,UTIL,FLAG>
SETZ UTIL,
SETZ FLAG,
SETOM FLAGEF
SETZM MOVSUM
MOVV1: CAIN FLAG,0
ADDI UTIL,1
MOVE REG1,LJFN
BIN
SKIPN FLAGEF
JRST MOVV2
MOVE IOREG,REG2
MOVE REG1,DCDJFN
BIN
SKIPN FLAGEF
JRST MOVV5
ADDM REG2,MOVSUM
CAMN IOREG,REG2
JRST MOVV1
AOJA FLAG,MOVV1
MOVV2: SETOM FLAGEF
MOVE REG1,DCDJFN
BIN
SKIPE FLAGEF
JRST MOVV4
JUMPN FLAG,MOVV3
HRROI REG1,[ASCIZ / [OK]
/]
PSOUT
RETURN
MOVV3: CAIE FLAG,1
JRST .+4
HRROI REG1,[ASCIZ / (There is one different word at /]
PSOUT
JRST MOVV03
HRROI REG1,[ASCIZ / (There are /]
PSOUT
TNOUT <FLAG>
HRROI REG1,[ASCIZ / different words, with the first difference at /]
PSOUT
MOVV03: TNOUT <UTIL>
HRROI REG1,[ASCIZ /.)
/]
PSOUT
RETURN
MOVV4: ADDM REG2,MOVSUM
BIN
SKIPE FLAGEF
JRST MOVV4
HRROI REG1,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
PSOUT
RETURN
MOVV5: HRROI REG1,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
PSOUT
ENDR
; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI: SETOM FLAGCO
DEBRK
EOFPSI: SKIPN FLAGEF
JRST EOFPSE
SETZM FLAGEF
DEBRK ; RETURN FROM INTERRUPT
EOFPSE: HRROI REG1,[ASCIZ / ?? UNEXPECTED EOF AT /]
PSOUT
MOVEI REG1,101
HRRZ REG2,PSIPC1
SUBI REG2,1
MOVEI REG3,10
SETZ REG4,
NOUT
JRST .+1
HRROI REG1,[ASCIZ / ??
/]
PSOUT
HALTF
JRST .-1
ILIPSI: HRRZ REG1,PSIPC1
MOVE REG2,-1(REG1)
CAMN REG2,[GTFDB]
JRST ILIPSD
CAMN REG2,[CHFDB]
JRST ILIPSD
HRROI REG1,[ASCIZ / ?? ILLEGAL INSTRUCTION AT /]
CAMN REG2,[-1]
HRROI REG1,[ASCIZ / ?? IMPOSSIBLE EVENT AT /]
PSOUT
MOVEI REG1,101
HRRZ REG2,PSIPC1
SUBI REG2,1
MOVEI REG3,10
SETZ REG4,
NOUT
JRST .+1
HRROI REG1,[ASCIZ / ??
/]
PSOUT
HALTF
JRST .-1
ILIPSD: HRROI REG1,[ASCIZ / (Bad local device.)
/]
PSOUT
AOS PSIPC1
DEBRK ; RETURN FROM INTERRUPT
>
; (((↑↑↑)))
; ***DATA***
CRLF: BYTE (7)15,12,0,0,0
SEMI: BYTE (7)73,15,12,0,0
HOSTS: 11,,[ASCIZ /HARVARD/]
37,,[ASCIZ /CCA/]
53,,[ASCIZ /OFFICE"-1/]
55,,[ASCIZ /SCI/]
56,,[ASCIZ /RUTGERS/]
61,,[ASCIZ /BBN/] ; TENEXB
70,,[ASCIZ /SUMEX/]
102,,[ASCIZ /AIC/]
126,,[ASCIZ /ISI/] ; ISI
162,,[ASCIZ /BBN/] ; TENEXD
226,,[ASCIZ /ISI/] ; ISIC
305,,[ASCIZ /BBN/] ; TENEXA
326,,[ASCIZ /ISI/] ; ISID
361,,[ASCIZ /BBN/] ; TENEXC
364,,[ASCIZ /ISI/] ; ISIB
0
LIT ; LITERALS GO HERE
; (((TOPS-10)))
IFE F.TENX,<
RELOC 0
ICPBLK: SIXBIT /IMP/
0
100 ; LOCAL SOCKET
40,,DCHOST ; 32 BIT BYTES (ICP), CCA HOST
DCSOKT ; DATACOMPUTER SOCKET
DCIBLK: SIXBIT /IMP/
0
102 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP + 1
DCOBLK: SIXBIT /IMP/
0
103 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP
DCDBLK: SIXBIT /IMP/
0
0 ; LOCAL SOCKET (104 RECEIVE, 105 SEND)
44,,DCHOST ; 36 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP +2 OR +3
WRKBLK: BLOCK 5
ICCHAS: 10 ; IMAGE MODE
SIXBIT /IMP/
0,,ICPBUF
ICPBUF: BLOCK 3
DCCHAS: 0 ; 7 BIT ASCII MODE
SIXBIT /IMP/
DCOBUF,,DCIBUF
DCIBUF: BLOCK 3
DCOBUF: BLOCK 3
DDCHAS: 13 ; BINARY
SIXBIT /IMP/
DDOBUF,,DDIBUF
DDIBUF: BLOCK 3
DDOBUF: BLOCK 3
LFILE: 0 ; LOCAL FILE NAME
0 ; EXTENSION
0 ; PROTECTION AND CREATION DATE
0 ; PROJ-PROG - 0 IS SELF
LFCHAS: 13 ; BINARY MODE
SIXBIT /DSK/
LFOBUF,,LFIBUF
LFIBUF: BLOCK 3
LFOBUF: BLOCK 3
LDIR: 0 ; PROJ-PROG OF USER
0 ; "UFD"
0
0 ; [1,1]
LDCHAS: 13
SIXBIT /DSK/
0,,LDIBUF
LDIBUF: BLOCK 3
LUTDSP: 0
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
LEVTAB: PSIPC1
PSIPC2
PSIPC3
PSIPC1: BLOCK 1
PSIPC2: BLOCK 1
PSIPC3: BLOCK 1
CHNTAB: 1,,TCOPSI
REPEAT 9,<EXP 0>
1,,EOFPSI
REPEAT 4,<EXP 0>
1,,ILIPSI
REPEAT ↑D20,<EXP 0>
FLAGCO: 0
FLAGEF: 0
DCSOCK: DCSOKT
ICPSOC: 0 ; ICP SOCKET
DCIJFN: 0 ; DC INPUT JFN
DCOJFN: 0 ; DC OUTPUT JFN
DCDJFN: 0 ; DC DATA JFN
LFILE: BLOCK SBUFS
LJFN: 0
PAGE: BLOCK SIZPAG
>
; (((↑↑↑)))
; * VARIABLES
LHOST: 0
ANCHOR: ASCIZ /DFTP/
BLOCK <SBUFS-1>
CMDMOD: 0
FLAGDD: 0
FLAGDE: 0
FLAGTT: 0
MOVSUM: 0
MOVSPA: 0
MOVTIM: 0
; * BLOCKS
CONTEX: BLOCK LBUFS
ABUF: BLOCK SBUFS
UBUF1: BLOCK LBUFS
UBUF2: BLOCK SBUFS
PBUF: BLOCK LBUFS
GBUF1: BLOCK LBUFS
GBUF2: BLOCK LBUFS
TCIPCL: BLOCK 100 ; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP: 0 ; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
BLOCK 37 ; (SIZE = # CHARS IN LARGEST CMD)
TCIPNF: 0 ; P(OSSIBLE)N(EXT)F(REE)
STSIZ==100
STBEG: BLOCK STSIZ
END DFTP